从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有一套相当奇怪的规则,你必须真正"投入其中"才能对此进行推理。许多事情可能会"悄无声息"地出错,你只需要艰难地解决它。在类似的情况下,以下是我试图弄清楚的方法:
-
尝试使用PowerShell中的COM接口。它提供了一个很好的"第二个POV"来查看问题是否可能在您的C#代码中。此外,通过这种方式进行测试通常要容易得多,可以将各种数据推入
-
做一些调试。使用MessageBox()技巧在C++(成员)函数开始时停止C++代码的执行,然后连接调试器并查看发生了什么。
-
前一点可能很耗时,有时一堆参数和其他状态的打印可以帮助您了解发生了什么。与PowerShell结合使用,您可以获得大量输入,并查看哪些原因会导致问题以及什么类型的问题。
相关文章:
- 写入访问冲突异常
- 在C++中删除双向链表的头节点后出现访问冲突异常
- Visual Studio图形调试器引发读取访问冲突异常
- 尝试将 std::cerr 重定向到文件时出现访问冲突异常
- 媒体基础:读取示例 - 访问冲突异常
- 链表的访问冲突异常
- 进入函数之前的访问冲突异常
- 删除函数 c++ 的读取访问冲突异常
- 无法使用 C++ catch(..) 捕获访问冲突异常
- 在Visual Studio Community中使用glfw3 glew和opengl获取访问冲突异常
- 访问动态 2D 字符数组时引发访问冲突异常
- 从静态库使用 Boost Asio 时访问冲突异常
- 为什么访问冲突异常不能被 捕获.NET4.0.
- glGenBuffers 访问冲突异常
- unsigned char*导致访问冲突异常
- 注入DLL的函数中出现访问冲突异常(5)
- 删除二叉搜索树中的节点中的 Visual Studio 中的访问冲突异常
- 提升 Asio tcp::接受者访问冲突异常
- 在 .Net 应用程序中调用 C++ DLL 时出现系统访问冲突异常
- 为什么此代码会引发访问冲突异常