我有一个从C#项目引用的托管C++ dll。C#项目将被编译为AnyCPU。有没有办法编译32位和64位版本的托管C++ dll,然后在运行时告诉C#项目根据它正在运行的体系结构加载正确的版本?
发布于 2016-11-23 00:58:37
让AnyCPU动态链接库使用C++动态链接库的诀窍是,在运行时确保程序集无法加载C++动态链接库,然后订阅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动态链接库访问C++功能。
发布于 2012-05-02 20:29:24
我不知道您如何“引用”Invoke dll(P/Invoke vs .net程序集引用),但无论哪种方式,您都可以在安装时交换两个版本的.dll。
https://stackoverflow.com/questions/10413590
复制相似问题