簡體   English   中英

C#到非托管C ++ DLL訪問沖突/“框架不在模塊中”

[英]c# to unmanaged c++ dll access violation / “frame not in module”

我有一個C#應用程序(在Unity3d mono中),它通過C-API將一些數據傳遞給c ++非托管DLL。 它傳入包含數組的嵌套Struct。 一切正常,直到C-API關閉(在函數的}時),然后我從VS2017獲得“ Frame not in Module”消息(如果我“>“ Continue”,我將收到訪問沖突0xC0000005 ,反匯編建議可能缺少ptr-因此可能是取消引用錯誤)

編輯:我認為這可能是我的源結構具有指向數組的指針//編輯

是什么原因導致此“框架不在模塊中”? -作為消息不是很豐富

那我該怎么辦?

我的代碼...

我有一個ac#結構層次結構。

private struct Vector3
{
    public float x;
    public float y;
    public float z;
}

private structure Location
{
    public Vector3 coords;
    public float distanceFromOrigin;
}

private struct Locations
{
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 10)]
    public Location[] locations;
}

private struct Scene
{
    public Locations cam1;
    public Locations cam2;
    public float timeInMilliSecs;
}

我正在實例化Scene並使用cam1cam2分別獲取10個位置的數組。 一切都很好。 至此可以正常工作,並且用正確的數據填充數據結構。

我將Scene的實例傳遞給非托管DLL

[DllImport(dllname)]
private static extern void updateScene(Scene scene);

在我的C ++中

extern "C" {
    DLL_EXPORT void updateScene(Scene scene);
}

和超載

void updateScene(Scene scene) {
    setSecene(scene); // this calls function fine but with erroneous data
}

和等效結構的簽名

struct Vector3
{
    float x;
    float y;
    float z;
}

struct Location
{
    Vector3 coords;
    float distanceFromOrigin;
}

struct Locations
{
    Location locations[10];
}

struct Scene
{
    Locations cam1;
    Locations cam2;
    float timeInMilliSecs;
}

將帶有正確數據的Scene結構傳遞給C ,然后將其傳遞給c ++。 但是隨后出現了問題-我猜這是內存問題,但是我不確定該怎么辦。

查看反匯編可能表明它是指針問題?

0000000040BDAE57 49 89 0B mov qword ptr [r11],rcx

有人可以幫忙嗎?

上次您說不更改CallingConvention ,請將值更改為Cdecl

DllImportAttribute默認值為WinApi ,它在函數調用后不會清除堆棧。

C代碼的默認值為__cdecl ,它也不會清除堆棧。 它等待呼叫者清除它。

發生例外。

最后,我將整個嵌套結構整理到一個指針中-c#中的所有更改

[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
private static extern void updateScene(IntPtr scene);

然后,在我調用updateScene()之前,我正在整理場景結構

IntPtr  scenePtr = Marshal.AllocHGlobal(Marshal.SizeOf(scene));
Marshal.StructureToPtr(scene, scenePtr , true);
updateScene(scenePtr);

其他一切都保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM