2010-03-04 19 views
5

Yönetilmeyen bir dll yükleyen ve C# 'dan birkaç dize değeri ileten basit bir uygulamam var. Ama C++ dll uygulamasında bir istisna alıyorum: Okuma/yazma korumalı belleğe erişmeye çalıştım. Benim DLL İthalat şöyle görünür:Yönetilmeyen C++ dizesine geçiş C# DLL

[DllImport("X.dll", CallingConvention = CallingConvention.Cdecl) ] 
public static extern int 
DumpToDBLogFile([MarshalAs(UnmanagedType.I4)]int loggingLevel, 
       [MarshalAs(UnmanagedType.I4)]int jobId, 
       int threadId, 
       [MarshalAs(UnmanagedType.LPStr)]string procName, 
       [MarshalAs(UnmanagedType.LPStr)]string message); 

ve C++ Bildirgesi

extern "C"  
__declspec(dllexport) int DumpToDBLogFile(int loggingLevel, int jobId, int threadId, string procName, string message) 
{ 
    //access strings.. 
} 

Yardım lütfen gibidir !!!

+0

C++ içindeki kodda olduğu gibi yığın içinde C# erişemiyor. – Kangkan

cevap

7
string != LPStr 

deneyin:

extern "C" 
__declspec(dllexport) int DumpToDBLogFile(int loggingLevel, int jobId, int threadId, char* procName, char* message) { //access strings.. 

} 
+0

Bu doğru. Std :: string yerine ham char * kabul etmek için C++ tarafındaki işlevin bildirimini değiştirin. –

+0

Bildirimi char * olarak değiştirdim ve işe yaradı. Ama ben bittikten sonra char * C++ 'dan ayrılmalı mıyım? Bu bellek sızıntısı sonucu olmazsa .. ?? – Prabhu

+0

Çok teşekkür ederim beyler. Bu problemle çok uzun zaman uğraştım. :( – DynamicScope

2

ben .... pinvoke imza değişiklik yapacağı

 
[DllImport("X.dll", CallingConvention = CallingConvention.Cdecl) ] 
public static extern int 
DumpToDBLogFile(int loggingLevel, int jobId, int threadId, StringBuilder procName, StringBuilder message); 

Ve başlatıldı StringBuilder sınıfını kullanın yönetilen taraftan

....

 
StringBuilder sbProcName = new StringBuilder(1024); 
StringBuilder sbMessage = new StringBuilder(1024); 

sbProcName ve DumpToDBLogFile için sbMessage ...

Umut bu, Saygılarımızla, Tom yardımcı olur.