托管C ++和AnyCPU

时间:2012-05-02 12:18:51

标签: c# .net managed-c++ anycpu

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

2 个答案:

答案 0 :(得分:3)

让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

答案 1 :(得分:1)

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

相关问题