【问题标题】:Managed C++ and AnyCPU托管 C++ 和 AnyCPU
【发布时间】:2012-05-11 22:01:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      让 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

      【讨论】:

      • 我也是。我不确定我是否会在生产中这样做,但这至少是一个可行的想法。投票归零以恢复不公正
      • 谢谢伊万!感谢您的支持:)
      • 感谢伊万的评论。我一直在考虑你所说的,而不是在生产中这样做。所以我想在这里做一点学习:) 你评论的来源是关于安全的吗?我确实意识到这是一个 hack,但据我所知,这是我知道如何从托管 C++ 完成支持 C# 的 AnyCPU 声明的几种方法。我知道的唯一其他方法是使用 PInvoke,我认为它也存在同样的问题。我开始意识到正确的方法是在安装时解决问题。
      • 使用程序集解析器在生产应用程序中加载依赖项意味着必须将自定义依赖项解析逻辑添加到与您的代码一起使用的每个工具中:单元测试框架、覆盖工具等。否则它们将无法找到所有必需的程序集。这个问题一开始可能看起来没什么大不了的,但很快就会变得非常烦人。我在一家公司工作,该公司的整个库版本控制方案都基于自定义程序集解析器;他们为此苦苦挣扎了几年,最终放弃了,恢复到标准的 .NET 程序集加载。
      • 其实这不是真的。依赖解析逻辑封装在 net dll 中。因此,任何依赖于 net dll 的 C# 代码都可以像使用任何其他 net dll 一样使用 net dll 中的公共对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 2017-04-28
      • 2010-12-28
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多