我正在使用Robert Giesecke的Unmanaged Exports將一些C#類的方法放入DLL中。現在,代碼:從Delphi應用程序訪問C#非託管導出
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int TestExport(int left, int right)
{
return left + right;
}
這是一樣的捷的示例代碼,一邊從CallingConvention
,但我也有Cdecl
嘗試過)。
我想在我的Delphi VCL WinForms應用程序中訪問這個方法。我正在關注this article,它正在討論從Delphi DLL導出並在Delphi控制檯應用程序中使用該函數。我可能在這裏錯誤地承擔了太多相似之處。
不管怎麼說,有兩個注意事項:
1)通過該DLL(從C#項目中導出GExperts's PE信息)列出了沒有出口。看到這個工具顯示可用輸出的入口點,這對我來說就是紅旗#1。我沒有檢查Dependency Walker。
2)Delphi的文章說要添加函數聲明,然後舉例說明。我的IDE不喜歡那種語法。這可能是應用程序與控制檯的區別。
const
TestExportsDLL = 'CS_CallbackTest_Class.dll';
type
TForm1 = class(TForm)
...
private
function AddIntegers(_a, _b: integer): integer; stdcall; external TestExportsDLL;
public
{ Public declarations }
end;
我已經嘗試了幾個不同的變化。假設使用RGiesecke.DllExport
是完成此操作的最佳方式,爲什麼我無法使Delphi應用程序編譯?
您已經聲明瞭一個方法,但需要一個獨立的函數。把它移到課堂外面。除了你將不得不在名稱的末尾添加'name'add''。 – TLama
再次閱讀文章。它絕不表示您可以導出表單的方法。事實上,你使用的例子在它的代碼的四個例子中沒有一個在它的實現前面有一個'TForm1'。 –
@Tlama好吧,它不在'TForm1'類。編譯。當我嘗試運行時,我收到「應用程序無法正確啓動(0xc000007b)。單擊確定關閉應用程序。」 'add'去哪了? @KenWhite這是因爲該文章指的是控制檯應用程序。所以根據@Tlama的建議,我已經將它從「TForm1」的實現中移出。 – ikathegreat