[英]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.