托管C ++和AnyCPU(Managed C++ and AnyCPU)

2019-07-29 06:00发布

我有我从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