托管C ++和AnyCPU

我有一个我从C#项目引用的Managed C ++ dll。 C#项目将编译为AnyCPU。 有没有办法编译32位和64位版本的Managed C ++ dll,然后在运行时告诉C#项目加载正确的一个,具体取决于它运行的架构?

本文讨论了一种复杂的方法,并参见Stefan的评论,该评论讨论了适用于某些应用程序的更简单的方法。

我不知道你如何“引用”C ++ DLL(P / Invoke vs .net程序集引用),但无论哪种方式,你都可以在安装时交换.dll的两个版本。

让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 ++function。

https://github.com/kevin-marshall/Managed.AnyCPU