我正在導入一些C++ dll到ac#項目中,我正在使用visual studio 2010.我已經成功導入了使用內置類型的函數,但是當我嘗試處理結構。這是一個簡單的例子:在c#項目中導入C++ dll
C++代碼
typedef long int TDate;
typedef struct _TMDYDate
{
long month; /* In range [1,12] */
long day; /* In range [1-31] */
long year; /* In range [1600-] */
} TMonthDayYear;
int JpmcdsDateToMDY
(TDate date, /* (I) TDate format */
TMonthDayYear *mdyDate);
,我已經翻譯成C#爲:
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct TMonthDayYear {
public int month;
public int day;
public int year;
}
public partial class NativeMethods {
[System.Runtime.InteropServices.DllImportAttribute("MyDll.dll", EntryPoint="JpmcdsDateToMDY")]
public static extern int JpmcdsDateToMDY(int date, ref TMonthDayYear mdyDate) ;
}
,當我嘗試運行我的測試程序中的功能我得到這個錯誤:
未處理的異常:System.AccessViolationException:試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞。在CsharpWrapper.NativeMethods.JpmcdsDateToMDY(的Int32日期,TMonthDayYear & MDY日期)
的結構是在棧中聲明,我認爲(也許)是問題,但我仍然得到,即使我有變化TMonthDayYear同樣的錯誤上課。
我在做什麼錯?
感謝您的幫助。
你在說什麼?示例代碼中的提示器聲明瞭什麼類型爲「Int64」? – 2011-03-04 12:20:29
@Cody Gray long int是Int64,而在代碼示例中,它被聲明爲int(Int32):native code:typedef long int TDate; int JpmcdsDateToMDY(TDate date,TMonthDayYear * mdyDate);我想知道如何使用C#中的靜態方法來實現這個功能。 – 2011-03-04 14:03:38
@Darius:這確實是你的猜測(不是不合理的),但這是不正確的。第一個指出的是安東(「長螞蟻int具有相同的大小,所以結構的實現是正確的」),同一個人發佈這個答案。看看我爲什麼困惑? – 2011-03-04 14:57:46