C#程序怎样才能使用任意版本的C++动态链接库?

6
我们正在创建一个用C++编写的dll,提供对某些硬件的访问。我们还有一个使用这个dll的C#程序。
我们遇到了版本问题。实际上,当运行C#程序时,它绝对要使用编译时所用的确切的C++ dll版本。例如,如果使用C++ dll 1.2.3.4编译C#程序,则该程序将拒绝使用C++ dll 1.2.3.5。
我希望指示C#程序使用任何版本为1.2.anything的C++ dll。
在C#项目中,我应该在哪里配置这个?
这个问题已经被那个问题所取代,更相关的是COM。

你的 C# 程序如何使用这个 dll? - JeffRSon
你使用C++/CLI汇编吗?请详细说明您如何构建软件... - alexbuisson
@alexbuisson 这个dll没有使用C++/CLI。这个dll被编译成本地可执行文件。 - Didier Trosset
3个回答

3
在C ++中不存在这种花哨的东西。使用并排清单在技术上允许此操作,但如果您在C#程序的清单中输入了版本号,那么您将知道它。
更有可能的解释是,您实际上创建了一个C ++ / CLI程序集。许多程序员将C ++ / CLI与C ++混淆。这是一种易犯的错误,因为该语言允许使用本机C ++代码。但是,它实际上被编译成一个混合模式程序集,该程序集包含IL和本机代码。当CLR加载此类程序集时,会发生正常的CLR版本检查,只有完全匹配版本才能使其正常工作。这是DLL Hell的强力对策。
并且可以使用正常的CLR版本控制选项来绕过此检查,在您的app.exe.config文件中使用元素。以及像您在C#代码中所做的方式控制程序集版本号,这样就不必这样做。
检查此猜测是否准确的最简单方法是使用Project + Add Reference并选择DLL。如果没有任何投诉,并且程序集添加到C#项目的引用节点中,则您“知道”它是一个普通的.NET程序集。别忘了利用它,不需要pinvoke。

1

在运行时加载动态链接库,并使用反射调用其方法。

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

Assembly.GetTypes();

Activator.CreateInstance(type);

哦,好的。你不能动态加载C++ dll吗? - Sam Leach

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中的描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接