c# - 托管 C++ 和 AnyCPU

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

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

最佳答案

让 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

关于c# - 托管 C++ 和 AnyCPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10413590/

相关文章:

c# - 可以在不使用托管 C++ 的情况下将 C++ dx 渲染器嵌入到 C# 应用程序中吗?

c# - 带 MVC3 的 Sitecore 6.5

c# - CLR GC 与 JVM 上最新的 ZGC 和 Shenandoah GC 相比如何?

c# - 以编程方式更新 DataGridView 中的多行

c# - 在 ashx 页面中分配隐藏字段值?

visual-c++ - C++/CLI -- 0xc000007b (INVALID_IMAGE_FORMAT) 带有/clr 选项

c++ - 用类 fnc 中的数据填充 vector

c# - WinProcEvent 一个或多个 SetWinEventHook 回调?

.net - 在控件上设置边距、宽度绑定(bind)到实际宽度会导致 VS2012 崩溃

c# - 如何在 C# 中读取带有 .net 4 的 IIS7 上的 web.config 的一部分