2015-03-30 134 views
0

我已經被委託編寫一個新的接口到一個傳統的C++ DLL我沒有源代碼,這是 - 由於我以外的原因 - 訪問遺留下的全局類直接應用。從C++ DLL訪問C#靜態類

從應用程序,它是這樣的:

extern Interface *App; 

... 

Interface App*; // A pointer to our interface class. 

然後,從傳統的DLL:

if(App->GetStatus()) return false; 

接口類應用程序是指是相當瑣碎的C#改寫,但如何我可以使它相當於extern,以便傳統的C++ DLL可以訪問它嗎?

謝謝!

+1

你不會得到很遠,這個只要你寫'接口應用*,理解指針對於獲取某個地方非常重要。從C++調用C#代碼需要首先加載CLR。有許多方法以錯誤的方式做到這一點,即以「簡單」的方式開始。在C++中使用#import指令是一個正確的方法。教育自己,向你的主管詢問你需要的資源。 – 2015-03-30 23:00:04

+0

請記住,海報表示他無法訪問C++源代碼,因此加載CLR可能會造成問題... – 2015-04-01 13:38:48

回答

0

你可以嘗試使用羅伯特捷的「UnmanagedExports」 NuGet包來實現這一功能,像這樣:

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.Cdecl)] 
    public static int TestExport(int left, int right) 
    { 
     return left + right; 
    } 
} 

然而

一)我相信這只是作品的方法,而不是類和

b)在C#中沒有本地方式導出DLL的原因是因爲調用應用程序必須加載.NET框架才能訪問該入口點。這也適用於我鏈接到上面的UnmanagedExports nuget包。

在調用C#應用程序之前,您可以通過讓C++應用程序加載單聲道來解決這個問題,但它聽起來不像您的情況。

(。此外,UnmanagedExports將只有當你明確地設置在項目屬性構建目標努力 - 例如86)

+0

只要調用一個導出的方法,就會加載.net框架。您的C++應用程序甚至可以使用不同版本的框架。 – jbriggs 2015-03-30 23:00:59

+0

只有當您的應用程序使用C++/CLI編寫時纔會發生這種情況。如果你的C++代碼是非託管的,它將不會加載.net框架 – 2015-03-30 23:07:37

+0

我從命令行編譯了一個本地C++程序'cl/EHsc MyConsoleApp.cpp/Fe:MyConsoleApp.exe' 在cpp文件中我有'typedef void \t (__stdcall * OPENDEVICES)();'' OPENDEVICES \t OpenDevices;'' HINSTANCE hGetProcIDDLL =的LoadLibrary( 「MyCSharpLib.dll」);'' OpenDevices \t = OPENDEVICES(GetProcAddress的(HMODULE(hGetProcIDDLL), 「OpenDevices」)) ;' 這工作。 MyCSharplib.dll使用.Net 4.0創建。我有一個使用Visual Studio 2005的客戶,在應用程序中使用它沒有問題。 – jbriggs 2015-03-31 18:18:54