2008-12-24 9 views
1

J'essaie d'apprendre les bases de l'attachement non géré C++ et. NET. Donc, j'ai la DLL compilée et appelable de C#. Génial. Maintenant, je rencontre ce problème bizarre:Strange DLL + InterropServices problème

Voici mon C++ fichier, Main.cpp:

#include <stdio.h> 

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

et le fichier 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(); 


     } 
    } 
} 

assez simple. Lorsque la construction, je reçois ConsoleApp.dll du côté C++, et FancyApp.exe de C#.

Effectué, il délivre en sortie

Bonjour former le monde de 2008!

Bonjour du monde de 1986!

Appuyez sur une touche pour quitter

comme il se doit, sauf en mode de sortie de VS2008 (Appuyez sur F5), je reçois

Bonjour former le monde de 2008!

Appuyez sur une touche pour quitter

Maintenant, si je vais à Explorer et exécuter la version release de FancyApp.exe sans VS, il fonctionne très bien.

Des idées?

J'ai téléchargé mon dossier de solutions here (180kb).

+0

Depuis printf est vraiment à partir de l'époque de C, ce devrait probablement être le monde de 1970. :) –

+0

Hehe. Je pensais que 1986 est à peu près au moment où Microsoft a créé Windows et ses DLL sophistiquées. – biozinc

Répondre

3

Eh bien, je vois le même comportement ici, et je ne peux pas l'expliquer complètement. Cependant, je pense qu'en essayant de fonctionner en mode de débogage (F5) contre une version Release, vous devriez vous attendre à un comportement indéfini. Si j'utilise ctrl-F5, il fonctionne correctement. Puisque cela fonctionne, nous pouvons déduire que le binaire est correctement construit, donc il n'y a pas de problème de compilateur, mais à la place vous voyez un artefact étrange du débogueur. Cela peut être prouvé en allant dans les propriétés de FancyApp et dans l'onglet Déboguer en décochant 'Activer le processus d'hébergement Visual Studio'. Si vous faites cela, cela fonctionne comme vous l'attendez. Pourquoi, exactement, je ne peux pas dire. La leçon ici est de ne pas essayer de déboguer une version release.