2008-08-28 84 views
2

聲明:近零與編組的概念..如何編組結構的數組 - (.NET/C#=> C++)

我有一個包含一個字符串+結構的數組C.我一個結構乙需要將這個跨越巨大的互操作性鴻溝發送給COM-C++用戶。
什麼是我需要修飾我的結構定義的屬性的正確集合?

[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; 
} 

編輯:@Andrew 基本上這是我的朋友的問題。他有這個東西在.Net工作 - 他做了一些automagic讓.tlb/.tlh創建,然後他可以在C++領域使用。 麻煩是他不能修復數組大小。

回答

1

答案取決於您嘗試編組的原生定義。你沒有提供足夠的信息讓任何人都能夠真正幫助。

當本地數組中的字符串編組時,常見的事情是本地數組通常對與內部分配的字符串使用固定大小的緩衝區。你的定義是編組字符串作爲指向另一個包含字符串的內存塊的指針(這是默認值)。

[的MarshalAs(UnmanagedType.ByValTStr,SizeConst = ##)]可能你正在尋找...

4

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

我正要接近一個需要跨元帥結構化數據的項目C++/C#邊界,但我發現什麼可能是更好的方法(特別是如果你瞭解C++並喜歡學習新的編程語言)。如果您有權訪問Visual Studio 2005或更高版本,則可以考慮使用C++/CLI而不是編組。它基本上允許您創建與C#100%兼容的這種神奇的混合.NET /本機類庫(就好像您已經用C#編寫所有內容,用於在另一個C#項目中使用它的目的),它也與C完全兼容和/或C++。在你的情況下,你可以編寫一個C++/CLI包裝器,將內存中的C++數據封裝到內存類型的CLI中。我使用純C++代碼讀取和寫出數據文件(這可能是某種第三方庫,甚至),然後我的C++/CLI代碼將(複製)將C++數據轉換爲內存中的.NET類型,這些數據可以直接使用,就好像我已經在C#中編寫了讀/寫庫一樣。對我來說,唯一的障礙是語法,因爲你必須學習C++的CLI擴展。我希望我有StackOverflow問語法問題,回來時,當我正在學習這個!

作爲對語法跋涉的回報,您可能會學習到最強大的可以想象的編程語言。想一想:C#和.NET庫的優雅和完美,以及C++的低級和本地庫兼容性。你不想用C++/CLI編寫所有的項目,但將C++數據轉換爲C#/ .NET項目非常棒。它「只是有用」。

教程: