簡體   English   中英

C#程序如何使用任何版本的C ++ DLL?

[英]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);
 }

}

MSDN中的描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM