2010-01-17 35 views
15

我們如何導出C#方法?如何導出C#方法?

我有一個DLL,我想在ctypes模塊的Python語言中使用它的方法。 因爲我需要使用ctypes模塊,所以我需要導出C#方法以使它們在Python中可見。因此,如何導出C#方法(就像他們在C++中那樣)?

+1

爲什麼不使用IronPython? – 2010-01-17 19:06:12

+0

教授的「訂單」 – 2010-01-17 21:17:40

+0

python.net允許使用Python C-API和.NET Pinvoke和Unmanaged Exports在Python和.NET之間進行雙向互操作,如下所述。所以所有的硬件都是爲你寫的! http://pythonnet.github.io/ – denfromufa 2016-09-08 04:29:12

回答

22

與流行的看法相反,這個可能的。
here

+1

我用dllexp.exe查看模板創建的C#dll導出的方法,它沒有發生該方法..有沒有辦法讓C#dll方法在像dllexp.exe這樣的程序中在外部可見? – 2010-01-18 11:51:28

+0

tks爲答案;) – 2010-01-19 22:25:23

1

使用正常的Python實現(「CPython」),您不能,至少不能直接。

您可以使用C++/CLI在我們的C#方法中編寫原生C封裝,並從Python中調用這些封裝。您可以嘗試IronPython。這使您可以運行Python代碼並以任何.Net語言調用代碼,包括C#。

+1

我想使用Python本身,而不是像IronPython這樣的額外實現。 – 2010-01-17 19:05:42

1

(這可能不再是因爲SLaks有關發現巧妙的聯繫,但我會離開一個參考編輯的版本...)

暴露.NET/C#對象的「正常」的方式非託管代碼(如Python)是爲C#DLL(.NET程序集)創建一個COM可調用的包裝器,並使用Python的COM/OLE支持調用該包裝器。要創建COM-callable包裝器,請使用tlbexp和/或regasm命令行實用程序。

然而,顯然,這並沒有提供SLaks鏈接所做的C/DLL風格的API。

+1

其實,這是可能的。看到我的答案。 – SLaks 2010-01-17 19:01:58

1

這是不可能的。如果你需要DLL導出,你需要使用C++/CLI語言。例如:

public ref class Class1 { 
public: 
    static int add(int a, int b) { 
     return a + b; 
    } 
}; 

extern "C" __declspec(dllexport) 
int add(int a, int b) { 
    return Class1::add(a, b); 
} 

該類也可以用C#編寫。 C++/CLI編譯器爲導出發出特殊的thunk,以確保CLR已加載並且執行切換到受管模式。這並不是很快。

在C#中編寫[ComVisible(true)]代碼是另一種可能性。

+1

其實,這是可能的。看到我的答案。 – SLaks 2010-01-17 19:13:47

+1

呃,文章和可下載的源代碼都不能解釋它是如何工作的。我會等待OP的確認。 – 2010-01-17 21:19:16

+0

我不得不建立一個包裝C++ dll(c#dll的)來正確使用ctypes模塊! – 2011-07-28 08:50:11