2012-10-19 65 views
0

我有一個問題,調用C DLL FOM C#本機C-DLL/C#中AccessViolation編組

C函數是(我沒有C頭還是不錯的規格爲這個:()

int knr12_read (char *kn12, char *ik9, char *wok, char *wlc, 
char *plz, char *ort, char *woz); 

kn12是ref參數

這是我在C#中

[return: MarshalAs(UnmanagedType.U4)] 
[DllImport("Knr12.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "knr12_read", CharSet = CharSet.Ansi)] 
unsafe public static extern int knr12_read(out IntPtr buffer, string ik9, string wok, string wlc, string plz, string ort, string woz); 

int knr = knr12_read(out pBuffer, knrTemp, "11111", "", "98529", "Suhl", "1"); 

string data = Marshal.PtrToStringAnsi(pBuffer); 

已經試過返回的int是人正確的方法,應該如何,但我有裁判參數p緩衝器問題...

而且對其他變量的刺痛類型的工作...

當我使用一個ref,我總是得到我用outAccessViolation errorknr12_read()。在情況下,我得到一個指針,但字符串總是空的,不能be.I甚至嘗試了String作爲refchar*,但我得到knr12_read()AccessViolation error

請指導。

回答

0

也許你沒有固定緩衝區。這裏是如何鎖定緩衝區數據的例子。

GCHandle pinnedRawData = GCHandle.Alloc(rawData, 
     GCHandleType.Pinned); 

釘住對象可確保指針是有效的原因.NET運行時可以隨時重新分配的,當它認爲合適的內存。

試試吧,讓我知道它是否可以幫助你。

+0

這也許值得補充,如果「C」代碼將保持指針返回後,這僅僅是必要的。 –

3

StringBuilder往往是一個很好的類型時使用P /調用到功能與返回字符串參數:

static extern int knr12_read(StringBuilder kn12, ...) 

你需要初始化字符串生成器調用功能,喜歡的東西之前:

StringBuilder outString = new StringBuilder(100); 

你不應該需要'不安全',並且除非'C'代碼在指針持有的時間超過了調用的持續時間,否則你不需要擔心固定 - 框架正在這樣做爲你。

這裏有一個SO問題,這應有助於:Marshal "char *" in C#