1
我被迫使用非託管的delphi dll。我沒有訪問源代碼。只有模糊的文檔:從C#應用程序調用Delphi函數時調用PInvokeStackImbalance
type
TServiceData = packed record
DBAlias: PChar;
LicKey: PChar;
Pass: PChar;
end;
PServiceData = ^TServiceData;
function CreateRole(SrvData: PServiceData; var UserName: PChar): byte; stdcall;
UserName
應該是一個out
PARAM。
我的C#代碼:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SERVICE_DATA
{
public string DBALias;
public string LicKey;
public string Pass;
}
[DllImport(dllname, CallingConvention = CallingConvention.StdCall)]
public static extern byte CreateRole(SERVICE_DATA data, out string str);
我不知道是什麼導致堆棧不平衡(除調用約定,這似乎是正確的)。我不知道我的結構中的字符串是否正確編組,但根據其他線程,這不會導致PStackImbalanceException。任何幫助將不勝感激:)
編輯。 從大衛我已經實現的建議,現在我得到的訪問衝突異常:
「未處理的異常:System.AccessViolationException:試圖讀取或寫入保護內存這通常是指示其他內存已損壞」
我的結構和方法的聲明僅僅是從答案拷貝粘貼,沒有什麼花哨的方式,我稱之爲:
string str;
var data = new SERVICE_DATA();
data.DBALias = "test";
data.LicKey = "test";
data.Pass = "test";
var result = CreateRole(ref data, out str);
aplying更改後的pinvokestackimbalance例外是走了,但現在我得到了AccessViolationException。 –
也許你的代碼中有一個bug。我看不到你的代碼。你問到堆棧不平衡。 –
你說得對,這不是我一開始就問的,所以我會把你的帖子標記爲答案。仍然 - 我已經添加了一些額外的代碼來解決我的問題。 –