C# 在非托管C++;项目->;0x7697C41F(KernelBase.dll)处的首次机会异常 我试图从一个非托管VisualC++解决方案中的C语言项目调用方法,但我仍然得到下一个错误 First-chance exception at 0x7697C41F (KernelBase.dll) in Program.exe: 0x04242420 (parameters: 0x31415927, 0x6F310000, 0x00BBDAE8).

C# 在非托管C++;项目->;0x7697C41F(KernelBase.dll)处的首次机会异常 我试图从一个非托管VisualC++解决方案中的C语言项目调用方法,但我仍然得到下一个错误 First-chance exception at 0x7697C41F (KernelBase.dll) in Program.exe: 0x04242420 (parameters: 0x31415927, 0x6F310000, 0x00BBDAE8).,c#,.net,visual-c++,com,com-interop,C#,.net,Visual C++,Com,Com Interop,在下一段代码中 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\SalesForce

在下一段代码中

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 };
        }
    }


}
实现接口的类:

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项目的属性中选中了选项
Register for COM interop
Make assembly COM Visible



更新:如果我们将C#COM项目的框架版本更改为2.0、3.0或3.5,则不会出现错误。它仅在frameworkversion为4.0或4.5时显示。

异常代码小于0x8000000的异常为非致命异常。它们往往被用来传递信息。鞋子适合这里,异常代码0x04242420被反向工程为CLRDBG_通知_异常_代码,在谷歌查询中键入数字以查看点击率。来自微软员工的信息可能是最可靠的:

出于好奇,我做了一些挖掘,发现这实际上是一个未记录的异常(CLRDBG_NOTIFICATION_exception_CODE),它显然是4.0 CLR中托管调试器使用的IPC协议的补充。忽略它应该是完全安全的


第一次机会异常被处理为异常。可以放心地忽略它们。所有你需要处理的事情。