我有我从C#项目引用一个托管C ++ DLL。 C#的项目将被编译为AnyCPU。 有什么办法来编译托管C ++ DLL的32位和64位版本,然后在运行时告诉C#项目加载正确的,这取决于架构是正在运行?
Answer 1:
诀窍获得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
Answer 2:
我不知道该怎么做,你“参考” C ++的DLL(P / Invoke的VS .NET程序集的引用),但无论哪种方式,你可以交换.dll文件在安装时的两个版本。
文章来源: Managed C++ and AnyCPU