2013-07-24 137 views
0

我有一个用于第三方应用程序的DLL,通常通过命名管道与它通信。但是NP只在其他应用程序启动时才起作用。我可以直接从dll调用一个方法来查看它的版本。从.NET调用C++方法

C++ VS2012

#ifdef MTFST_EXPORTS 
#define MTFST_API __declspec(dllexport) 
#else 
#define MTFST_API __declspec(dllimport) 
#endif 

#define LIBRARY_VERSION  "3.0" 

    .... 

using namespace std; 

MTFST_API char *__stdcall FST_LibraryVersion() 
{ 
    return LIBRARY_VERSION; 
} 

我尝试下面的代码,但它不工作。 .NET 4.

internal class Program 
{ 
    [DllImport("Library.dll")] 
    private static extern char[] FST_LibraryVersion(); 

    private static void Main(string[] args) 
    { 
     Console.WriteLine(new string(FST_LibraryVersion())); 
    } 
} 
+0

尝试使用编译模式 '在任何CPU',代替X86或64,或与X86汇编 – Gisway

+0

.NET代码值为anycpu。 C++ lib是x86。 –

+0

您的C++函数返回'IntPtr',而不是'char []'。请参阅:http://stackoverflow.com/questions/370079/pinvoke-for-c-function-that-returns-char – 2013-07-24 16:30:56

回答

1

.NET数组与原始指针不兼容。你需要要么使用IntPtr或通过在目标缓冲区的功能:

void __stdcall FST_LibraryVersion(char *dest) 
{ 
    strcpy(dest, LIBRARY_VERSION); 
} 

很显然,你需要包括检查,以防止缓冲区溢出。

此外,请参阅PInvoke for C function that returns char *