[英]Use functions in C# from unmanaged C-DLL (AccessViolationException)
我有一個帶有簡短文檔的C-DLL,我想在我的C#程序中使用此DLL。
不幸的是,文檔是針對受密碼保護的Excel-Makro的,因此我不知道確切的函數名稱和參數類型。
我使用DependencyWalker來查找DLL的所有導出功能,並與文檔一起我發現,所記錄的函數ptx在DLL中稱為FU_PTX ,並且期望一個參數並具有返回值。 不幸的是,我仍然不知道參數的類型或返回值,但我知道它是一個數字。
所以我寫了下面的代碼:
...
[DllImport("dmata.dll")]
public static extern UInt32 FU_PTX(UInt32 x);
FU_PTX(11);
...
此代碼引發AccessViolationException 。 我也嘗試了其他類型,如int , long , double,但是我總是遇到相同的異常。
據我所知,沒有辦法直接從dll中獲取所需的類型,但也許任何人都知道有什么問題或可以向正確的方向指出。
編輯:
我設法從vba文件獲取簽名:
Private Declare Function FU_PTX# Lib "dmata.dll" (FT#)
我將其移植到以下C#代碼:
[DllImport("dmata.dll")]
public static extern double FU_PTX(double x);
FU_PTX(1.5);
我仍然收到相同的AccessViolationException 。 有人知道為什么我仍然會遇到同樣的異常嗎?
這個語法:
Private Declare Function FU_PTX# Lib "dmata.dll" (FT#)
對#
后綴的使用比較晦澀; 在“現代” VBA中(如果可以說是這樣的話),聲明將是
Private Declare Function FU_PTX Lib "dmata.dll" (ByRef FT As Double) As Double
注意不幸的是默認的ByRef
; 默認情況下,參數是通過VBA中的引用傳遞的(即使該函數無意修改它們)。
這應與以下C#聲明相對應:
[DllImport("dmata.dll")]
public static extern double FU_PTX(ref double FT);
由於參數是通過引用傳遞的,因此您不能傳遞常量,而必須始終使用變量:
double ft = 11.0;
FU_PTX(ref ft);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.