2015-09-01 49 views
1

我正在使用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應用程序編譯?

+1

您已經聲明瞭一個方法,但需要一個獨立的函數。把它移到課堂外面。除了你將不得不在名稱的末尾添加'name'add''。 – TLama

+0

再次閱讀文章。它絕不表示您可以導出表單的方法。事實上,你使用的例子在它的代碼的四個例子中沒有一個在它的實現前面有一個'TForm1'。 –

+0

@Tlama好吧,它不在'TForm1'類。編譯。當我嘗試運行時,我收到「應用程序無法正確啓動(0xc000007b)。單擊確定關閉應用程序。」 'add'去哪了? @KenWhite這是因爲該文章指的是控制檯應用程序。所以根據@Tlama的建議,我已經將它從「TForm1」的實現中移出。 – ikathegreat

回答

1

很難知道爲什麼該功能未被導出。你沒有描述你製作DLL的步驟。 UnmanagedExports確實可以工作。按照記錄的步驟非常仔細。您可以在鏈接到的文檔中找到一個可能的線索:

只有在構建選項中選擇了特定CPU目標(x86,x64,Itanium)後,纔會執行該任務。

直到你得到一個導出你的函數的DLL,沒有太多的意義繼續到Pascal代碼。

您的導入代碼很混亂。外部函數必須在單元範圍內聲明。一個完整的導入程序如下所示:

{$apptype console} 

const 
    dllname = '...'; // replace this with the actual name 

function add(left, right: Integer): Integer; stdcall; external dllname; 

begin 
    Writeln(add(42, 624)); 
    Readln; 
end. 
相關問題