Установка в N ++ пользовательского интерфейса, написанного на C ++ / CLI, может вызвать сбой программы - PullRequest
1 голос
/ 18 мая 2011

У меня есть собственный интерфейс .Net, написанный на C ++ / CLI:

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 #.Установка нулевого интерфейса не приведет к сбою программы:

interface IAnotherInterface
{
}
private IAnotherInterface test = null;

Что не так в моем интерфейсе C ++ / CLI?

[Замечания]

Я создалдва «чистых» новых проекта для тестирования, первый - это библиотека классов C ++ / CLI (Новый проект -> Visual C ++ -> CLR -> Библиотека классов).Добавьте следующие строки в файл .h библиотеки:

public interface class ITest {
};

Затем создайте проект приложения Windows Form (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.

Ответы [ 2 ]

1 голос
/ 19 мая 2011

Нулевое назначение, вероятно, не ошибка, а триггер для ошибки. Это присвоение нулю, вероятно, является первой строкой кода, которая обращается к той сборке C ++ / CLI. Таким образом, перед выполнением этого нулевого присвоения инициализируется неуправляемая часть сборки C ++ / CLI. Вероятно, именно здесь происходит ошибка.

1 голос
/ 19 мая 2011

Вы проверили, чтобы убедиться, что на целевых машинах установлена ​​правильная версия Microsoft Visual C ++ Runtime? (В вашей среде разработки это будет уже установлено, но ни одна текущая версия Windows не включает эту среду выполнения по умолчанию).

Если вы настроили свой проект C ++ / CLI на использование режима «SAFE», он вообще не будет ссылаться на среду выполнения Microsoft Visual c ++ (только .NET). См. Это для справки: Чистый и проверяемый код . Если вам нужно делать нативные вещи, то очень велика вероятность того, что вам нужно будет установить последнюю версию Visual C ++. Вы можете получить распространяемый пакет здесь: Распространяемый пакет Microsoft Visual C ++ 2010 .

Если вы хотите убедиться, что это проблема, вы можете использовать инструмент sxstrace для диагностики этих проблем ( полезное руководство ).

...