Я пытаюсь изучить основы связывания неуправляемого 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#.
При запуске выводит
Hello form the World of 2008!
Hello from the World of 1986!
Press any key to exit
как и должно быть, кроме режима выпуска из VS2008 (нажмите F5), я получаю
Hello form the World of 2008!
Press any key to exit
Теперь, если я захожу в проводник и запускаю сборку релиза FancyApp.exe без VS, она работает нормально.
Идеи?
Я загрузил папку с решениями здесь (180kb).
Хе-хе. Я подумал, что 1986 год - это примерно то время, когда Microsoft представила Windows и ее модные библиотеки DLL.





Что ж, я вижу здесь то же самое поведение и не могу полностью его объяснить. Однако я думаю, что при попытке запустить в режиме отладки (F5) против сборки Release вы должны ожидать неопределенного поведения. Если я использую ctrl-F5, он работает правильно.
Поскольку это работает, мы можем сделать вывод, что двоичный файл построен правильно, поэтому проблема с компилятором отсутствует, но вместо этого вы видите какой-то странный артефакт отладчика.
Это можно проверить, зайдя в свойства FancyApp и на вкладке «Отладка» сняв флажок «Включить процесс хостинга Visual Studio». Если вы это сделаете, все будет работать так, как вы ожидаете. Почему именно, не могу сказать. Урок здесь в том, что не пытайтесь отлаживать сборку релиза.
Поскольку printf действительно со времен C, вероятно, это должен быть World of 1970. :)