【问题标题】:Using C# COM in unmanaged C++ project -> First-chance exception at 0x7697C41F (KernelBase.dll)在非托管 C++ 项目中使用 C# COM -> 0x7697C41F (KernelBase.dll) 处的第一次机会异常
【发布时间】:2012-11-23 07:47:18
【问题描述】:

我正在尝试在非托管 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 项目属性中的选项Register for COM interopMake assembly COM-Visible


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

【问题讨论】:

  • 第一次机会异常是已处理的异常。可以安全地忽略它们。您需要处理的所有其他事情。

标签: c# .net visual-c++ com com-interop


【解决方案1】:

异常代码小于0x80000000的异常是非致命异常。它们往往被用来传递信息。鞋子适合这里,异常代码 0x04242420 已被逆向工程为 CLRDBG_NOTIFICATION_EXCEPTION_CODE,在谷歌查询中输入数字以查看命中。来自微软员工的This answer 可能是最可靠的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2014-12-10
    • 2011-10-14
    • 1970-01-01
    • 2011-05-22
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多