visual-studio-2010 – 从Visual Studio 2010中的Win32调用者调试.Net4 COM注册程序集

这是一个非常简单的设置,我无法相信,但到目前为止我没有找到任何有同样问题的人…

在VS2010中创建.Net4类库.创建一个最简单的COM对象:

[ComVisible(true)]
[Guid("CD157EBC-C89D-40b6-B531-E85FF4B3AE9A")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IAcorn
{
    bool Foo(string moo);
}


[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("854B7690-C1C4-40c4-8059-B4F3450B30D0")]
public class Acorn : IAcorn
{
    public Acorn()
    {
    }

    public bool Foo(string moo)
    {
        return true;
    }
}

为程序集设置“注册COM互操作”选项.将“平台目标”设置为x86.

使用Delphi创建Win32客户端,导入对象,使用正常实例化实例化它(转换为
CoCreateInstance(ClassID,nil,CLSCTX_INPROC_SERVER或
    CLSCTX_LOCAL_SERVER,IUnknown,Result))

运行Win32应用程序,一切正常.

尝试从VS2010调试COM对象.设置类库Debug选项以启动外部程序,指向刚刚创建的可执行文件.当您从VS210启动Win32应用程序时,程序在尝试实例化COM时崩溃(使用StackOverflow).

将目标框架更改为.Net 3.5从VS2010启动调试,一切正常,包括调试.

注 – 使用CLR托管或非托管导出COM实例时,这也是一个问题.这两种方法都适用于.Net4,但无法进行调试.

问题是标准的 – 为什么会发生这种情况并且有解决方法吗?

最佳答案 .NET框架和Delphi可以在FPU控制字中设置或期望不同的值.

在调用.NET代码并在.NET代码完成后重置它之前,可以通过显式设置寄存器来避免这个问题:

How can I set and restore FPU CTRL registers?

点赞