在非托管C ++项目中使用C# COM -> 在0x7697C41F(KernelBase.dll)处首次机会异常。

11

我正在尝试在一个非托管的Visual C++解决方案中调用来自C# COM项目的方法,但是我一直遇到下面的错误:

First-chance exception at 0x7697C41F (KernelBase.dll) in Program.exe: 0x04242420 (parameters: 0x31415927, 0x6F310000, 0x00BBDAE8).

在下面的代码片段中,
SalesForceNew::IMyObjectClassPtr p;
p.CreateInstance(__uuidof(SalesForceNew::TestObject)); // error
SalesForceNew::MyObject mo = p->getObject(1, "a");

然而mo的值与预期相符合(5, "aa")。

我使用以下代码导入tlb文件:

#import "C:\Users\Bob\Desktop\ComTest\SalesForceNew\bin\x86\Debug\SalesForceNew.tlb" named_guids

以下是 C# 项目:
接口:
using System.Runtime.InteropServices;

namespace SalesForceNew
{
    [ComVisible(true)]
    [Guid("22901ACD-CA30-4D3E-B84B-73B707026AE5")]
    public interface IMyObjectClass
    {
        MyObject getObject(int i, string s);
    }

    [ComVisible(true)]
    [StructLayout(LayoutKind.Sequential)]
    public struct MyObject
    {
        public int Getal;
        public string Text;
    }
}

实现接口的类:
using System.Runtime.InteropServices;

namespace SalesForceNew
{
    [ClassInterface(ClassInterfaceType.None)]
    [Guid("234A2A35-F270-458D-A67B-C834EB794B27")]
    [ComVisible(true)]
    public class TestObject : IMyObjectClass
    {
        public MyObject getObject(int i, string s)
        {
            return new MyObject() { Getal = i * 5, Text = s + s };
        }
    }


}

我在 C# COM 项目的属性中勾选了 注册 COM 互操作使程序集对 COM 可见 选项。
更新:如果将 C# COM 项目的框架版本更改为 2.0、3.0 或 3.5,该错误就不会出现。它只在框架版本为 4.0 或 4.5 时显示。

2
第一次机会异常是已处理的异常。它们可以安全地忽略。其他所有异常都需要您处理。 - leppie
1个回答

17

异常代码小于0x80000000的异常是非致命异常。它们往往用于传递信息。这里适用,异常代码0x04242420已被反向工程为CLRDBG_NOTIFICATION_EXCEPTION_CODE,在Google查询中输入该数字即可查看相关结果。这篇来自微软员工的回答可能是最可靠的:

出于好奇心,我进行了一些调查,发现这实际上是一个未经记录的异常(CLRDBG_NOTIFICATION_EXCEPTION_CODE),显然是4.0 CLR中托管调试器使用的IPC协议的补充。 完全可以安全忽略。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接