[英]How can a C# program use a C++ dll of any version?
我們正在創建一個用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#項目中配置它?
這個問題已經被取代一個 ,更關系到COM。
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。
在運行時加載dll並使用反射來調用它的方法。
Assembly assembly = Assembly.LoadFrom("C:\\test.dll");
Assembly.GetTypes();
Activator.CreateInstance(type);
我不認為可以將程序配置為使用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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.