托管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。