6

我们正在创建一个用 C++ 编写的 dll,提供对某些硬件的访问。我们还有一个使用这个 dll 的 C# 程序。

我们的版本有问题。事实上,在运行 C# 程序时,它绝对希望使用它在编译时使用的确切 C++ dll 版本。即如果 C# 程序是使用 C++ dll 1.2.3.4 编译的,那么程序将拒绝使用 C++ dll 1.2.3.5 运行。

我想指示 C# 程序使用任何版本为 1.2.anything 的 C++ dll。

我可以在 C# 项目中的哪里配置它?

这个问题已被与 COM 更相关的那个问题所取代。

4

3 回答 3

3

C++ 中不存在这种幻想。使用并排清单在技术上允许这样做,但您会知道它,因为您会在 C# 程序的清单中键入版本号。

更有可能的解释是您实际上创建了一个 C++/CLI 程序集。许多程序员将 C++/CLI 与 C++ 混淆。容易出错,因为该语言允许使用本机 C++ 代码。但它实际上被编译为混合模式程序集,即包含 IL 和本机代码的程序集。当 CLR 加载此类程序集时,会对此类程序集进行正常的 CLR 版本检查,它只对精确的版本匹配感到满意。强大的 DLL 地狱对策。

并且正常的 CLR 版本争论选项可用于绕过此检查,这<bindingRedirect>是您的 app.exe.config 文件中的一个元素。除了以您为 C# 代码执行此操作的方式控制程序集版本号外,这不是必需的。

检查这个猜测是否准确的最简单方法是使用 Project + Add Reference 并选择 DLL。如果这没有引起任何抱怨并且程序集被添加到 C# 项目的 References 节点,那么您就知道它是一个普通的 .NET 程序集。不要忘记利用这一点,不需要 pinvoke。

于 2013-07-11T09:07:56.000 回答
1

我认为不可能将您的程序配置为使用 1.2.* 版本而没有其他版本。除非您自己为此编写代码。另一种可能性是不更改 C++ dll 的版本标记,但您似乎不想这样做。

避免版本依赖性的解决方案是使用 dllimport。您可以使用它加载任何用 C++ 编写的 dll。它没有版本依赖。请参阅 msdn 中的示例和最后的链接:

using System;
using System.Runtime.InteropServices;

class Example
{
 // Use DllImport to import the Win32 MessageBox function.
 [DllImport("user32.dll", CharSet = CharSet.Unicode)]
 public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

 static void Main()
 {
     // Call the MessageBox function using platform invoke.
    MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
 }

}

MSDN 中的描述

于 2013-07-11T08:30:57.920 回答
1

在运行时加载 dll 并使用反射来调用它的方法。

Assembly assembly = Assembly.LoadFrom("C:\\test.dll");

Assembly.GetTypes();

Activator.CreateInstance(type);
于 2013-07-11T08:12:19.050 回答