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

3

我有一个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位控制台应用程序中使用反射加载此包装器?这是正确的方法吗?任何示例代码都将非常有帮助。

1个回答

4
如果您已经将两个程序集明确定位为32位和64位构建,则无法将32位程序集加载到64位进程中(反之亦然)。
如果可能的话,您可以将32位程序集重新构建为“任何CPU”?这将允许您将“Simple32bitAssembly”加载到64位控制台应用程序中。
关于您的评论:
“有业务限制,我不能将我的32位dll编译为'任何CPU'。”
唯一的解决办法是将32位程序集部署到单独的32位代理进程中。该进程可以通过.NET技术公开功能,例如:
WCF Remoting ASP.NET Web Service 缺点是跨进程调用可能很昂贵(尽管您可以在WCF或Remoting中使用命名管道),并增加了应用程序的复杂性。
您也将不再能够直接从使用64应用程序的组件上使用反射(但您可以在代理中使用反射)。
这就是混合体系结构应用程序的考验。

有商业限制,我无法将我的32位 DLL 编译为“Any CPU”。 - Ajit Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接