1

我有一个用 C++/CLI 编写的自定义 .Net 接口:

public interface class IBackgroundExtractor
{
};

在我的 C# 应用程序中,该接口由以下人员使用:

private IBackgroundExtractor extractor = null;

上面的代码在我的电脑(安装了 Visual Studio)中运行顺利,但在另一台电脑上崩溃了(没有安装 Visual Studio):

AppName: speedtest.exe   AppVer: 1.0.0.0     ModName: kernel32.dll
ModVer: 5.1.2600.5512    Offset: 00012aeb

如果我删除空分配,代码将在两台计算机上运行:

private IBackgroundExtractor extractor;

但是,我用纯 C# 制作了另一个接口。将接口设置为 null 不会使程序崩溃:

interface IAnotherInterface
{
}
private IAnotherInterface test = null;

我的 C++/CLI 界面有什么问题?

[评论]

我创建了两个“干净”的新项目进行测试,第一个是 C++/CLI 类库(新项目 -> Visual C++ -> CLR -> 类库)。将以下行添加到库的 .h 文件中:

public interface class ITest {
};

然后创建一个 Windows Form Application 项目(Net Project -> Visual C# -> Windows -> Windows Forms Application)并在主函数中声明一个 ITest 变量:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());

    ITest xxx = null;
}

该程序将在开发计算机(安装了 Visual Studio)中运行,但在另外两台计算机中崩溃。其中一台崩溃的计算机是物理机,另一台是虚拟机。

我正在使用 Windows XP Pro SP3、Visual Studio 2010 和 .Net Framework 4.0。

4

2 回答 2

1

您是否检查过以确保目标计算机上安装了正确版本的 Microsoft Visual C++ 运行时?(您的开发环境已经安装了这个,但当前版本的 Windows 默认不包含这个运行时)。

如果您将 C++/CLI 项目设置为使用“安全”模式,则它根本不会引用 Microsoft Visual c++ 运行时(只是 .NET)。请参阅此参考:Pure and Verifiable Code。如果你需要做原生的东西,那么你很有可能需要安装最新的 Visual C++ 运行时。您可以在此处获取可再发行组件:Microsoft Visual C++ 2010 Redistributable Package

如果您想验证这是否是问题所在,您可以使用该sxstrace工具来诊断这些问题(有用的教程)。

于 2011-05-19T03:10:20.057 回答
1

空分配可能不是错误,而是错误的触发器。这个对 null 的赋值可能是访问 C++/CLI 程序集的第一行代码。因此,在执行该空分配之前,C++/CLI 程序集的非托管部分已被初始化。那可能是发生错误的地方。

于 2011-05-19T03:37:40.850 回答