我有一个托管 C++ dll,我从 C# 项目中引用它。 C# 项目将被编译为 AnyCPU。有没有办法编译 32 位和 64 位版本的托管 C++ dll,然后告诉 C# 项目在运行时根据正在运行的体系结构加载正确的版本?
让 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++ 功能。
https://github.com/kevin-marshall/Managed.AnyCPU https://github.com/kevin-marshall/Managed.AnyCPU
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)