2012-06-04 46 views
0

在C++中,我導出方法是:數據值beeing複製到其他參數C++,C#

__declspec(dllexport) int __thiscall A::check(char *x,char *y,char *z) 
{ 
    temp=new B(x,y,z); 
} 

在C#我導入像這樣此方法:

[DllImport("IDLL.dll", CallingConvention=CallingConvention.ThisCall, ExactSpelling = true, EntryPoint = "check")] 
    public static extern int check(string x, string y, string z); 

我打電話在C#這樣的這種方法並傳遞值:

public int temp() 
{ 
    string x="sdf"; 
    string y="dfggh"; 
    string z="vbnfg"; 
    int t; 

    t=Class1.check(x,y,z); 
    return t; 
} 

的問題是,當我調試到NAT ive代碼我發現參數x,y,z的值爲sdf,dfggh,vbnfg,並且在它們進入本機C++ dll方法之前,在它們到達C++ dll時會被更改。

x=dfggh,y=vbnfg,z=null value 

並給我的錯誤說空指針值傳遞給函數。任何人都可以幫助我解決這個奇怪的問題。

+0

只是看了一下一些代碼,我幾年前寫的。嘗試在每個'string'參數之前添加'[MarshalAs(UnmanagedType.LPStr)]'。 'UnmanagedType.LPStr'表示_指向ANSI字符_的空終止數組的指針。 – hmjd

+0

這是真的,只有z變成了零,並且x和y沒有問題?如果是,那麼檢查B修改z的那些部分。 – kol

+0

@kol ---甚至在進入構造函數B本身之前,值正在改變。 – krishna555

回答

1

看起來你的本地方法是一個實例(vs靜態)方法。我想你的第一個參數以某種方式映射到「this」。

下面是一個例子:

#include <fstream> 
using namespace std; 

class A 
{ 
public: 
__declspec(dllexport) static int __stdcall check(char *x,char *y,char *z) 
{ 
    ofstream f; 
    f.open("c:\\temp\\test.txt"); 
    f<<x<<endl; 
    f<<y<<endl; 
    f<<z<<endl; 
    return 0; 

    } 

__declspec(dllexport) int __thiscall checkInst(char *x,char *y,char *z) 
{ 
    ofstream f; 
    f.open("c:\\temp\\testInst.txt"); 
    f<<x<<endl; 
    f<<y<<endl; 
    f<<z<<endl; 
    return 0; 

    } 
}; 

看到了第一位靜態關鍵字?

進口(我使用的已損壞的名字,因爲我懶):

[DllImport("TestDLL.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true, EntryPoint = "[email protected]@@[email protected]")] 
    public static extern int check(string x, string y, string z); 

    [DllImport("TestDLL.dll", CallingConvention = CallingConvention.ThisCall, ExactSpelling = true, EntryPoint = "[email protected]@@[email protected]")] 
    public static extern int checkInst(IntPtr theObject, string x, string y, string z); 

這使得它的工作就像這樣:

check("x", "yy", "zzz"); 

實例方法需要一個IntPtr

IntPtr obj = IntPtr.Zero; 
checkInst(obj, "1", "12", "123"); 

和我的test.txt的內容是:

x 
yy 
zzz 

和testInst.txt

1 
12 
123 
+0

你是什麼意思「本地方法是一個實例(vs靜態)方法」 – krishna555

+0

A ::檢查看起來像一個非靜態(它需要一個對象)方法在類A上,你需要導出靜態方法或函數P/Invoke工作 – Bond

+0

我認爲沒有必要使用pinvoke來靜態方法。因此,該方法是類型__stdcall它需要是靜態的? – krishna555