2012-03-11 11 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

+0

@Gangadharはい、私はC#の関数にC#ではなく(C#ではない)汎用リストオブジェクト(またはオブジェクトの配列)を渡す方法を探しています。 – olidev

+0

あなたはこれを見ましたか?あなたの質問の枠を広げるのに役立つかもしれません。 http://www.codeguru.com/forum/showthread.php?t=354807 –

答えて

1

アンマネージド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++関数に2番目のパラメータを渡すことです。

// 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

+0

これはP/Invokeです。 C++/CLIは異なる(類似の)概念です。あなたのC++コードが管理されたC++(.NET CLRへの直接参照を持つC++)で書かれている場合、これを行う必要はありません。VB.NETまたはC#で書かれたアセンブリと同じように、 。 –

+0

また、正しい場合は回答を受け入れることを忘れないでください。ユーザー投票はこのサイトの機能です。 –

関連する問題