2008-12-24 48 views
1

我在學習綁定非託管C++和.NET的基礎知識。所以,我已經從C#編譯並調用了DLL。大。現在我遇到這個奇怪的問題:奇怪的DLL + InterPerServices問題

這裏是我的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(); 


     } 
    } 
} 

夠簡單。構建時,我從C++端獲得ConsoleApp.dll,從C#獲得FancyApp.exe

運行時,它輸出

你好形成2008年的世界!

你好,1986年的世界!

按任意鍵退出

,因爲它應該,除了從VS2008(按F5鍵)發佈模式,我得到

你好形成2008年的世界!

按任意鍵退出

現在,如果我去探險家和而不VS運行的FancyApp.exe發行版本,它運行良好。

想法?

我已經上傳解決方案的文件夾here(180KB)。

+0

由於printf真的是來自C的日子,那應該是1970年的世界。:) – 2008-12-24 18:10:26

回答

3

那麼我在這裏看到相同的行爲,我不能完全解釋它。不過我認爲,試圖在調試模式(F5)下運行Release版本,您應該期望未定義的行爲。如果我使用Ctrl-F5,它會正常運行。

由於這是行得通的,我們可以推斷二進制文件是正確構建的,所以沒有編譯器問題,但是您會看到調試器的一些奇怪的工件。

這可以通過進入FancyApp的屬性並在Debug選項卡上取消選中「啓用Visual Studio託管過程」來驗證。如果你這樣做,它就像你期待的那樣。爲什麼,我不能說。這裏的教訓是不要試圖調試發佈版本。