c# - 任何 cpu 和 x64 之间的托管代码引用

标签 c# .net c++-cli mixed-mode

我有一个混合模式的 C++/CLI 项目,它被编译为 x86 和 x64 卡住的 dll。

我有一个 C# 应用程序需要使用这个编译为“任何 CPU”的项目。 如何从 c# 应用程序正确引用正确的 dll? 如果我右键单击添加引用,我必须只选择 2 个 dll 中的一个。
我的“任何 CPU”C# 应用有时会作为 x64 进程运行,有时会作为 x86 进程运行。

我听说您可以通过智能配置文件来完成此操作。

最佳答案

有几种方法可以解决这个问题。第一个最简单,承认您的应用程序实际上确实对目标体系结构具有依赖性这一事实。 AnyCPU 不是正确的设置。 非常很少需要从 x64 获得的巨大虚拟地址内存空间,尤其是因为您还希望并且需要让它在 x86 上工作。因此,将 EXE 的平台目标设置为 x86,您就完成了。

其次得出的结论是这只是一个部署问题。当您的应用程序安装在 64 位操作系统上时,您所要做的就是复制混合模式程序集的 x64 版本,而 x86 版本则安装在 32 位操作系统上。您需要创建一个安装项目来处理这个问题。最简单的方法是创建其中两个。也是 afaik 的唯一方法。

第三个是带有铃铛的那个,无论哪种方式都可以工作,您无疑会问这个。这需要更改代码、项目和安装程序。您需要做的是编写一个构建后事件,该事件创建两个子目录,名称分别为“x86”和“x64”。并将相应版本的 DLL 复制到其中。这可确保 CLR 无法找到这些程序集。

在您的代码中,您必须为 AppDomain.CurrentDomain.AssemblyResolve 事件编写事件处理程序。在您尝试使用程序集中的任何类型之前,在您的 Main() 方法中订阅它。事件处理程序必须使用 Assembly.LoadFrom() 根据 IntPtr.Size 的值从子目录加载正确的程序集。在 64 位模式下运行时为 8。

我应该提到另一种方法,但在 SO 中通常不赞成这种方法。将两个程序集都安装到 GAC 中。一切都是自动的。

关于c# - 任何 cpu 和 x64 之间的托管代码引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5196095/

相关文章:

c# - 在 Windows Phone 8 Bing map 上设置图钉 (XAML C#)

c# - .NET 中的 Windows 身份验证

.net - 无区域 Controller 的子文件夹

c# - SQL 数据库 VS。多个平面文件(数以千计的小型 CSV)

c# - 在c#中的每个字符后插入一个逗号

c# - 如何从数据库中获取可为空的 DateTime

c# - 在 .NET 中以编程方式检索断开连接的网络适配器信息

c# - 使用多个工作线程、多个源线程和接收器线程来执行线程 .net 应用程序的优雅方法?

sorting - cli C++ 对某个属性的对象列表进行排序

properties - C++/CLI 中的属性是什么?