簡體   English   中英

通過C ++ 64位dll在64位.net應用中PInvoke

[英]PInvoke in 64bit .net app through c++ 64 bit dll

我在ac#應用程序內部的c ++ dll中調用函數時遇到問題。 我在c#內部調用函數,如下所示:

[DllImport("cryptopp.dll")]
public static extern IntPtr RSAEncryptString(string filename, string seed, string message);

如下所示,它正在c ++ dll中導出。

extern "C" __declspec(dllexport) const char* __cdecl RSAEncryptString(const char *pubFilename, const char *seed, const char *message);

但是,當我嘗試調用此方法時,得到的是“外部組件引發了異常”。 異常,這根本不是非常描述性的,並且非常無益。

當我在導出查看器中拉起dll時,它會顯示具有完全量化聲明的所有其他導出函數(IE public:void __cdecl CryptoPP :: X509PublicKey ::`vbase destructor'(void)__ptr64),但我使用的函數除外調用,僅顯示函數名稱RSAEncryptString。

這是我看到的唯一可能的問題,除了可能會在c#端使用無效的聲明錯誤地調用函數。 我使用System.Runtime.InteropServices.Marshal錯了嗎?

請幫助<3,並提前致謝。

我認為您需要將第一行更改為:

[DllImport("cryptopp.dll",
    CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]

如果您希望獲得非常好的描述性,還可以添加以下內容:

public static extern IntPtr RSAEncryptString(
    [In, MarshalAs(UnmanagedType.LPStr)] string filename,
    [In, MarshalAs(UnmanagedType.LPStr)] string seed,
    [In, MarshalAs(UnmanagedType.LPStr)] string message);

IIRC認為CharSet應該為您處理編碼事務,但如果不這樣做,也請使用MarshalAs ,如上所示。


編輯:

哦,我想我知道為什么您仍然遇到錯誤! 您的代碼仍然存在上述問題,但仍會出錯,因為您不能返回string對象,因為它不是托管對象; 您需要返回一個指針(如IntPtr ),然后使用Marshal.PtrToStringAnsi

(最初回答此問題時,我並未真正查看您的返回類型。)

似乎您正在嘗試將const char *LPCSTR )類型的返回值存儲到IntPtr類型(通常用於HANDLE而不是LPSTR )。嘗試以下操作:

[DllImport("cryptopp.dll", CharSet = CharSet.Auto)]
public static extern String RSAEncryptString(String filename, String seed, String message);

還要記住,如果任何參數是越來越寫入,您就需要添加out它的類型,即前..., out String message)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM