Странная проблема DLL + InterropServices

Я пытаюсь изучить основы связывания неуправляемого 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).

Поскольку printf действительно со времен C, вероятно, это должен быть World of 1970. :)

Steve Fallows 24.12.2008 21:10

Хе-хе. Я подумал, что 1986 год - это примерно то время, когда Microsoft представила Windows и ее модные библиотеки DLL.

biozinc 25.12.2008 00:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Другие вопросы по теме