簡體   English   中英

從C#調用C ++函數時出現訪問沖突異常

[英]Access violation exception when calling C++ function from C#

我有以下C ++函數(屬於一個COM接口,派生自IUnknown),我想從C#代碼調用它:

記錄的C ++聲明:

HRESULT Function1([in] STRUCT1 *s1, [in, out] STRUCT2 *s2, [in] SIZE_T var1);

工作C ++程序中的聲明:

    STDMETHOD(Function1)(
    THIS_
    __out STRUCT1 * s1,
    __in_ecount_opt(var1) const STRUCT2 * s2,
    SIZE_T var1
    ) PURE;

在C#領域,我定義了以下內容:

[StructLayout(LayoutKind.Sequential)]
public struct STRUCT1
{
    public uint  member1;     //HRESULT member1
    public ulong member2;     //SIZE_T member2
}

[StructLayout(LayoutKind.Sequential)]
public struct STRUCT2 
{
    public IntPtr  member1;   //VOID *member1;
    public ulong   member2;   //SIZE_T  member2;
    public STRUCT3 member3;   //STRUCT3 member3;
}

[StructLayout(LayoutKind.Sequential)]
public struct STRUCT3
{
    public int member1;  //int member1
}

我在C#中實現了這個函數,如下所示:

[ComImport, ComVisible(false), InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
Guid("…")]
public interface Iinterface1 
{
……


    uint Function1(ref STRUCT1 s1, ref STRUCT2 s2, ulong var1);
……
}

我調用這樣的函數:

            STRUCT1 temp1 = new STRUCT1();
            temp1.member1 = 0;
            temp1.member2 = 0;

            STRUCT2 temp2 = new STRUCT2();
            STRUCT3 temp3 = new STRUCT3();
            temp3.member1 = 0;
            temp2.member1 = IntPtr.Zero;
            temp2.member2 = 0;
            temp2.member3 = temp3;
            ulong var1 = 1;

            res1 = COMobject.Function1(ref temp1, ref temp2, var1);

執行函數時,我收到訪問沖突異常:

“prog1.exe中發生了'System.AccessViolationException'類型的未處理異常附加信息:嘗試讀取或寫入受保護的內存。 這通常表明其他內存已損壞。

我實現了同一接口的大多數功能沒有問題,以及此應用程序中的許多其他接口。 這個讓我很困惑。

我非常感謝你對此的幫助..

先感謝您。

COM-Interop有一套相當奇怪的規則,你必須真正“進入它”來推理它。 許多事情可能會“默默地”出錯,你只需要艱難地解決它。 在類似的情況下,這就是我要做的事情,試圖解決問題:

  1. 嘗試使用PowerShell的COM接口。 它提供了一個很好的“第二個POV”來查看問題是否在您的C#代碼中。 此外,以這種方式進行測試通常要容易得多,推送各種數據。

  2. 做一些調試。 使用MessageBox()技巧在C ++(成員)函數的開頭停止執行C ++代碼,然后附加調試器並查看發生了什么。

  3. 前一點可能很耗時,有時一堆參數和其他狀態的printf可以幫助你弄清楚發生了什么。 結合PowerShell,您可以獲得大量輸入,並查看導致問題和問題的原因。

暫無
暫無

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

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