8

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

4

2 回答 2

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

于 2016-11-22T16:58:36.880 回答
1

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

于 2012-05-02T12:29:23.717 回答