Странная проблема DLL + InterropServices - PullRequest
1 голос
/ 24 декабря 2008

Я пытаюсь изучить основы связывания неуправляемых C ++ и .NET. Итак, я получил DLL скомпилирован и вызывается из C #. Отлично. Теперь я столкнулся с этой странной проблемой:

Вот мой файл C ++, Main.cpp:

#include <stdio.h>

extern "C" __declspec(dllexport) void DisplayHelloFromDLL()
{
    printf ("Hello from the World of 1986!\n");
}

и файл C #, Program.cs:

using System; using System.Runtime.InteropServices;

namespace FancyApp {
    class Program
    {
        [DllImport("ConsoleApp.dll")]
        public static extern void DisplayHelloFromDLL();

        static void Main()
        {
            Console.WriteLine("Hello form the World of 2008!");
            DisplayHelloFromDLL();

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();


       }
    }
}

Достаточно просто. При сборке я получаю ConsoleApp.dll со стороны C ++ и FancyApp.exe со стороны C #.

При запуске выдает

Привет, мир 2008 года!

Привет из мира 1986 года!

Нажмите любую клавишу для выхода

как и положено, кроме режима Release от VS2008 (нажмите F5), я получаю

Привет, мир 2008 года!

Нажмите любую клавишу для выхода

Теперь, если я захожу в Проводник и запускаю сборку выпуска FancyApp.exe без VS, он работает нормально.

Идеи

Я загрузил папку с решениями сюда (180kb).

1 Ответ

3 голосов
/ 24 декабря 2008

Ну, я вижу то же самое поведение здесь, и я не могу полностью объяснить это. Однако я думаю, что пытаясь работать в режиме отладки (F5) против сборки Release, вы должны ожидать неопределенного поведения. Если я использую Ctrl-F5, он работает правильно.

Поскольку это работает, мы можем сделать вывод, что двоичный файл построен правильно, поэтому нет проблем с компилятором, но вместо этого вы видите какой-то странный артефакт отладчика.

Это можно проверить, перейдя в свойства FancyApp и на вкладке «Отладка» сняв флажок «Включить процесс размещения Visual Studio». Если вы это сделаете, это работает так, как вы ожидаете. Почему именно я не могу сказать. Урок здесь - не пытайтесь отлаживать сборку релиза.

...