2012-03-11 22 views
0

我想從C#配置C++項目。如何從C#中將對象設置爲C++#

例如:如果我有這個類在C#:

public class Person 
{ 
    public Person(){} 

    public string FirstName 
    {get; set;} 

    public string LastName 
    {get; set;} 

    public int Age 
    {get; set;} 
} 

然後,我有人員名單:

Person per1 = new Person(); 
per1.FirstName = "Per1"; 
per1.LastName = "Last"; 
per1.Age = 20; 


Person per2 = new Person(); 
per2.FirstName = "Per2"; 
per2.LastName = "Last2"; 
per2.Age = 21; 

那麼我:

List<Person> persons = new List(); 
persons.Add(per1); 
persons.Add(per2); 

我的問題是我怎麼能通過'

在C++源代碼中的列表。

一個樣本非常感謝!

在此先感謝。

+0

您是否希望通過在C#創建作爲參數傳遞給在C++的一些函數的對象?這是個問題嗎?你能澄清一下嗎? – Gangadhar 2012-03-11 01:12:37

+0

@Gangadhar是的,我正在尋找一種方法將C#中的通用List對象(或對象數組)傳遞給C++(而不是C#)中的函數。 – olidev 2012-03-11 01:13:38

+0

你看過嗎?它可以幫助你更好地構建你的問題。 http://www.codeguru.com/forum/showthread.php?t=354807 – 2012-03-11 01:17:58

回答

1

您不能將List<>傳遞給非託管C++,因爲它無法訪問CLR並且不知道如何處理它。

您可以做的是在C++中定義一個與C#類的佈局相匹配的結構,並將其傳遞給導出的需要數組的C++函數。取決於你有多大的控制在C#和C++的定義,有一些事情可以做,以使對自己的生活更輕鬆:

首先,記住定義與互操作的C#類型:

// In C#: 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
public struct Person 
{ 
    [MarshalAs(UnmanagedType.LPWStr)] public string FirstName; 
    [MarshalAs(UnmanagedType.LPWStr)] public string LastName; 
    public int Age; 
} 

// In C++ 
typedef struct tagPerson 
{ 
    LPWSTR firstname; 
    LPWSTR lastname; 
    LONG age; 
} Person; 

其次,由於C/C++數組沒有管理,你需要一些其他方法來定義它有多大;最簡單的選擇是將第二個參數傳遞給長度爲C++的函數。

// In C++ 
extern "C" __declspec(dllexport) void MyFunction(LONG count, Person[] people); 

// In C# 
[DllImport("mydll.dll")] 
public static extern void MyFunction(
    int count, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] Person[] people); 

然後,你可以簡單地調用C#此方法;如果你已經有人口List<Person>你可以這樣做:

var personsArray = persons.ToArray(); 
NativeMethods.MyFunction(personsArray.Length, personsArray); 
+0

我非常感謝這篇文章。非常好!我不知道這個方法叫什麼?它是C++/CLI還是別的名字?我會盡快回復這篇文章!再次感謝 – olidev 2012-03-11 09:21:15

+0

這是P/Invoke。 C++/CLI是一個不同的(相似的)概念;如果你的C++代碼是用託管的C++編寫的(C++直接引用了.NET CLR),那麼你不需要做任何這些,你可以直接引用它,就像用VB.NET或C#編寫的程序集一樣。 。 – 2012-03-11 14:53:55

+0

也不要忘了接受一個答案,如果它是正確的,或者如果他們有幫助的話可以補充答案;用戶投票是這個網站的功能。 – 2012-03-11 17:22:38

相關問題