我有一个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加载这个包装器?这是这样的吗?任何示例代码都非常有用。
答案 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应用程序中直接在此组件上使用反射(但您可以在代理中使用反射)。
这是混合架构应用的试验。