我们正在创建一个用C++编写的动态链接库,提供对一些硬件的访问。我们还有一个使用这个dll的C#程序。
我们的版本出了点问题。实际上,在运行C#程序时,它绝对希望使用它在编译时使用的确切的C++ dll版本。也就是说,如果C#程序是使用C++动态链接库1.2.3.4编译的,那么该程序将拒绝使用C++动态链接库1.2.3.5运行。
我想指示C#程序使用任何1.2版的C++动态链接库。
我可以在C#项目中的什么地方配置它?
这个问题已经被that one取代了,它更多地与COM有关。
发布于 2013-07-11 09:07:56
在C++中不存在这种奇特的东西。使用并列清单在技术上允许这样做,但是您应该知道这一点,因为您已经在C#程序的清单中键入了版本号。
更有可能的解释是,您实际上创建了一个C++/CLI程序集。许多程序员将C++/CLI与C++混淆。由于该语言允许使用本机C++代码,因此很容易出错。但它实际上被编译成一个混合模式的程序集,一个同时包含IL和本机代码的程序集。当CLR加载这样的程序集时,将对该程序集进行常规的CLR版本检查,它只对精确的版本匹配感到满意。一个强大的DLL地狱反制措施。
普通的CLR version wrangling选项可以绕过这个检查,它是app.exe.config文件中的一个<bindingRedirect>
元素。以及控制程序集版本号的方式,就像您对C#代码所做的那样,所以这是不必要的。
检查此猜测是否准确的最简单方法是使用Project + Add Reference并选择DLL。如果这没有引起任何抱怨,并且程序集被添加到您的C#项目的References节点,那么您就知道它是一个普通的.NET程序集。别忘了利用这一点,不需要pinvoke。
发布于 2013-07-11 08:12:19
在运行时加载dll,并使用反射调用它的方法。
Assembly assembly = Assembly.LoadFrom("C:\\test.dll");
Assembly.GetTypes();
Activator.CreateInstance(type);
发布于 2013-07-11 08:30:58
我认为不可能将您的程序配置为使用1.2.*版本而不使用其他版本。除非你自己写代码。另一种可能是不更改C++动态链接库的版本标记,但您似乎并不想这样做。
避免版本依赖的一种解决方案是使用dllimport。你可以用它加载任何用C++编写的动态链接库。它不依赖于版本。请参阅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);
}
}
https://stackoverflow.com/questions/17588029
复制相似问题