首页 文章

从C#调用C函数时出现访问冲突异常

提问于
浏览
3

我有以下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'类型的未处理异常附加信息:尝试读取或写入受保护的内存 . 这通常表明其他内存已损坏 . “

我实现了同一接口的大多数功能没有问题,以及该应用程序中的许多其他接口 . 这个让我很困惑 .

我非常感谢你对此的帮助..

先感谢您 .

1 回答

  • 1

    COM-Interop有一套相当奇怪的规则,你必须真正“进入它”来推理它 . 许多事情可能会“默默地”出错,你只需要艰难地解决它 . 在类似的情况下,这就是我要做的事情,试图解决问题:

    • 尝试使用PowerShell的COM接口 . 它提供了一个很好的“第二个POV”,以查看问题是否在您的C#代码中 . 此外,以这种方式进行测试通常要容易得多,推送各种数据 .

    • 做一些调试 . 使用MessageBox()技巧在C(成员)函数的开头停止执行C代码,然后附加调试器并查看发生了什么 .

    • 前一点可能很耗时,有时一堆参数和其他状态的printf可以帮助你弄清楚发生了什么 . 结合PowerShell,您可以获得大量输入,并查看导致问题和问题的原因 .

相关问题