我们正在创建一个用C ++编写的dll,提供对某些硬件的访问。我们还有一个使用这个DLL的C#程序。
我们遇到版本问题。实际上,在运行C#程序时,它绝对想要使用它在编译时使用的确切C ++ DLL版本。即如果C#程序是使用C ++ DLL 1.2.3.4编译的,那么程序将拒绝使用C ++ dll 1.2.3.5运行。
我想指示C#程序使用1.2版本的任何C ++ dll。
我在哪里可以在C#项目中配置它?
此问题已被that one取代,与COM更相关。
答案 0 :(得分:3)
C ++中没有这种奇特的东西。使用并排清单在技术上允许这样做,但您可能已经了解它,因为您将在C#程序的清单中键入版本号。
更可能的解释是您实际创建了C ++ / CLI程序集。许多程序员将C ++ / CLI与C ++混淆。由于该语言允许使用本机C ++代码,因此很容易出错。但它实际上被编译为混合模式程序集,这是一个包含IL和本机代码的程序集。当CLR加载它时,会对这样的程序集进行正常的CLR版本检查,它只对精确的版本匹配感到满意。一个强大的DLL地狱反措施。
正常的CLR版本争用选项可用于绕过此检查,即app.exe.config文件中的<bindingRedirect>
元素。除了按照C#代码的方式控制程序集版本号,所以这不是必需的。
检查此猜测是否准确的最简单方法是使用Project + Add Reference并选择DLL。如果这没有引起任何抱怨并且程序集被添加到C#项目的References节点,那么你知道它是一个普通的.NET程序集。不要忘记利用它,不需要pinvoke。
答案 1 :(得分:1)
在运行时加载dll并使用反射来调用它的方法。
Assembly assembly = Assembly.LoadFrom("C:\\test.dll");
Assembly.GetTypes();
Activator.CreateInstance(type);
答案 2 :(得分: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);
}
}