使用反射从.NET 64位exe调用.NET 32位dll中的方法

时间:2010-10-05 12:07:05

标签: c# reflection 64-bit

我有一个32位的.NET类库,它有一个简单的公共类和一个简单的公共方法。我有一个使用反射的64位.NET控制台应用程序,我希望加载32位程序集并使用它的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using Host.TestLib;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            var lib = Assembly.LoadFrom("Simple32bitAssembly.dll");
        }
    }
}

当我运行此操作时,我会抛出以下异常:

System.BadImageFormatException was unhandled
Message=Could not load file or assembly 
'file:///E:\AjitTemp\c\32bit64Bit\ReflectionTest\test\bin\Debug\Simple32bitAssembly.dll' 
or one of its dependencies. An attempt was made to load a program with an incorrect format.

谷歌搜索建议我需要为这个32位的dll创建一个64位的包装器,并在我的64位控制台应用程序中使用relection加载这个包装器?这是这样的吗?任何示例代码都非常有用。

1 个答案:

答案 0 :(得分:4)

如果您将两个程序集专门定位为32位和64位构建,则无法将32位程序集加载到64位进程中(反之亦然)。

如果可能,您可以将32位程序集重建为“任何CPU”吗?这将允许您将“Simple32bitAssembly”加载到64位控制台应用程序中。

关于你的评论:

“存在业务限制,我无法将我的32位dll编译为'任何CPU'。”

解决这个问题的唯一方法是将32位程序集部署到单独的32位代理进程中。此过程可以通过.NET技术公开功能,例如:

    WCF
    Remoting
    ASP.NET Web Service

缺点是跨进程调用可能很昂贵(尽管您可以在WCF或Remoting中使用命名管道)并增加应用程序的复杂性。

您也不再能够在使用64应用程序中直接在此组件上使用反射(但您可以在代理中使用反射)。

这是混合架构应用的试验。