2008-08-28 9 views
2

Avertissement: proche de zéro avec les concepts de triages ..Comment maréchal un tableau de struct - (.Net/C# => C++)

J'ai un B struct qui contient une chaîne + un tableau de struct C. I besoin d 'envoyer ceci à travers le gouffre interop géant à un consommateur COM - C++.
De quels attributs ai-je besoin pour décorer ma définition de structure?

[ComVisible (true)] 
[StructLayout(LayoutKind.Sequential)] 
public struct A 
{ 
    public string strA 
    public B b; 
} 


[ComVisible (true)] 
[StructLayout(LayoutKind.Sequential)] 
public struct B 
{ 
    public int Count; 

    [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct, SizeParamIndex=0)] 
    public C [] c; 
} 

[ComVisible (true)] 
[StructLayout(LayoutKind.Sequential)] 
public struct C 
{ 
    public string strVar; 
} 

modifier: En gros, cela @ Andrew est le problème de mes amis. Il a cette chose qui fonctionne dans .Net - Il fait de l'automagique pour avoir le .tlb/.tlh créé qu'il peut ensuite utiliser dans le domaine C++. Le problème est qu'il ne peut pas fixer la taille du tableau.

Répondre

1

La réponse dépend des définitions natives que vous essayez de rassembler. Vous n'avez pas fourni assez d'informations pour que quelqu'un puisse vraiment vous aider. Une chose courante qui fait trébucher les gens lors de la mise en place de chaînes dans des tableaux natifs est que les tableaux natifs utilisent souvent un tampon de taille fixe pour la chaîne allouée en ligne avec la structure. Votre définition consiste à rassembler les chaînes sous la forme d'un pointeur vers un autre bloc de mémoire contenant la chaîne (qui est la valeur par défaut).

[MarshalAs (UnmanagedType.ByValTStr, SizeConst = ##)] peut-être ce que vous cherchez ...

4

C++: The Most Powerful Language for .NET Framework Programming

J'étais sur le point d'aborder un projet qui devait rassembler des données structurées sur la limite C++/C#, mais j'ai trouvé ce qui pourrait être un meilleur moyen (surtout si vous connaissez C++ et aimez apprendre de nouveaux langages de programmation). Si vous avez accès à Visual Studio 2005 ou supérieur, vous pouvez envisager d'utiliser C++/CLI plutôt que marshaling. Il vous permet essentiellement de créer cette bibliothèque hybride magic .NET/natif qui est 100% compatible avec C# (comme si vous aviez écrit tout en C#, pour le consommer dans un autre projet C#) qui est également 100% compatible avec C et/ou C++. Dans votre cas, vous pouvez écrire un wrapper C++/CLI qui a rassemblé les données de C++ en mémoire vers CLI dans les types de mémoire. J'ai eu beaucoup de chance avec ceci, en utilisant du code C++ pur pour lire et écrire des fichiers de données (cela pourrait être une bibliothèque tierce de quelque sorte, même), et puis mon code C++/CLI convertit (copies) les données C++ dans les types .NET, en mémoire, qui peuvent être consommés directement comme si j'avais écrit la bibliothèque de lecture/écriture en C#. Pour moi, le seul obstacle était la syntaxe, puisque vous devez apprendre les extensions CLI en C++. J'aurais aimé que StackOverflow pose des questions sur la syntaxe, quand je l'ai appris!

En retour de la syntaxe, vous apprenez probablement le langage de programmation le plus puissant imaginable. Pensez-y: l'élégance et la santé mentale des bibliothèques C# et .NET, ainsi que la compatibilité de C + + avec les librairies natives et de bas niveau. Vous ne voudriez pas écrire tous vos projets en C++/CLI mais c'est génial pour obtenir des données C++ dans des projets C#/.NET. Cela "fonctionne juste".

Tutoriel:

Questions connexes