我有一个我从C#项目引用的Managed C ++ dll。 C#项目将编译为AnyCPU。有没有办法编译32位和64位版本的Managed C ++ dll,然后在运行时告诉C#项目加载正确的C#项目,具体取决于它运行的架构?
答案 0 :(得分:3)
让AnyCPU dll与C ++ dll一起使用的技巧是在运行时确保程序集无法加载C ++ dll然后订阅AppDomain AssemblyResolve事件。当程序集尝试加载dll并失败时,您的代码就有机会确定需要加载哪个dll。
订阅活动看起来像这样:
System.AppDomain.CurrentDomain.AssemblyResolve += Resolver;
事件处理程序看起来像这样:
System.Reflection.Assembly Resolver(object sender, System.ResolveEventArgs args)
{
string assembly_dll = new AssemblyName(args.Name).Name + ".dll";
string assembly_directory = "Parent directory of the C++ dlls";
Assembly assembly = null;
if(Environment.Is64BitProcess)
{
assembly = Assembly.LoadFrom(assembly_directory + @"\x64\" + assembly_dll);
}
else
{
assembly = Assembly.LoadFrom(assembly_directory + @"\x86\" + assembly_dll);
}
return assembly;
}
我创建了一个简单的项目,演示了如何从AnyCPU dll访问C ++功能。
答案 1 :(得分:1)
我不知道你如何'引用'C ++ dll(P / Invoke vs .net程序集引用),但无论哪种方式,你都可以在安装时交换.dll的两个版本。