2012-09-27 51 views
1

我遇到了將.net本機DLL導入.net的問題。 我得到System.EntryPointNotFoundException在C#中使用Delphi本機DLL(DllImport問題)

這裏是我的德爾福DLL:

procedure ProcedimientoEncriptar(texto,clave,resultado:PChar); export stdcall; 
    var ... 
    begin 
    .... 
    .... 
    end; 

    exports 
     ProcedimientoEncriptar ; 

這是我的.Net的的DllImport(C#)代碼:

[DllImport("CryptoDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)] 
     public static extern void ProcedimientoEncriptar([MarshalAs(UnmanagedType.LPStr)]string texto, [MarshalAs(UnmanagedType.LPStr)]string clave, [MarshalAs(UnmanagedType.LPStr)] StringBuilder resultado); 

任何幫助,將不勝感激, 迭戈。

+1

這不是我認爲的你的實際代碼。 Delphi'函數'意味着有一個返回值。但你的不。而你的C#代碼有'void'返回。你的Delphi代碼真的是「功能」嗎?不是'程序'。問題中的Delphi代碼不能編譯。將代碼放入問題時請使用複製/粘貼。不要發佈虛假代碼。 –

+0

你說得對,它是'程序',但我爲了測試目的而改變了它(我試着返回一個'PChar')。 –

+1

什麼德爾福版本? 'PChar'是否是Unicode? –

回答

4

System.EntryPointNotFoundException唯一的解釋是,C#代碼找到的DLL不是從您展示的Delphi代碼生成的DLL。因此,也許C#代碼正在挑選DLL的過時版本。或者也許它正在挑選一個完全不同的DLL。

例如,我的系統在system32目錄中有一個名爲cryptdll.dll的DLL。最有可能的就是你的C#代碼找到的DLL。

爲了確保找到正確的DLL,您需要將Delphi DLL的副本放在與C#可執行文件相同的目錄中。

+0

謝謝David,那就是問題所在。我不知道系統上存在'cryptdll.dll'。 我重命名並將dll複製到/ bin /目錄,它工作(這是一個ASP .Net應用程序)。 乾杯,迭戈。 –

+0

@Diego Iturriaga:大衛是對的。在窗口中,D.L.L.的位置可能是一個問題,並且與Delphi生成無關,在這種情況下,D.L.L可能會發生同樣的錯誤。以其他語言編譯,以及錯誤的文件系統位置。 – umlcat