首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >托管C++和AnyCPU

托管C++和AnyCPU
EN

Stack Overflow用户
提问于 2012-05-02 20:18:51
回答 2查看 3.9K关注 0票数 8

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

EN

回答 2

Stack Overflow用户

发布于 2016-11-23 00:58:37

让AnyCPU动态链接库使用C++动态链接库的诀窍是,在运行时确保程序集无法加载C++动态链接库,然后订阅AppDomain AssemblyResolve事件。当程序集尝试加载dll但失败时,您的代码有机会确定需要加载哪个dll。

订阅事件如下所示:

代码语言:javascript
复制
System.AppDomain.CurrentDomain.AssemblyResolve += Resolver;

事件处理程序如下所示:

代码语言:javascript
复制
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动态链接库访问C++功能。

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

票数 3
EN

Stack Overflow用户

发布于 2012-05-02 20:29:24

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10413590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档