, C#

2013-08-02 15 views
6

içinden geçirilen bilinmeyen c yapısında yineleyin C# programından erişilmesi gereken bir c .dll geliştiriyorum. İdeal olarak, .dll C# içinde tanımlanan herhangi bir yapı almalı ve onunla bir şey yapmalıdır. Bu nedenle, başlangıçta, yapı tipi ve boyutu C dll için bilinmemektedir. Yapıyı C extern işlevinden geçirebildim ve iyi bir şekilde alındığı söylendi ancak bu alma yapısının büyüklüğünü ve özelliklerini bulmanın bir yolu var mı? üyeleri üzerinde yinelemenin bir yolu var mı? , C#

Bu

DLL

extern int __cdecl testCSharp(mystruct * Test){ 

//sizeof(Test) is 4, so it is ok 

for(int i=0;i < sizeof(Test) ; i++){ 

    char * value = (char*) Test; //This access the first element. 
    cout << value << endl; //Prints "some random string", so, it is received ok 
} 

return 1; 

}

Bu

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)] 
unsafe public struct myStruct{ 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value1; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value2; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value3; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value4; 
}; 

[DllImport("SMKcomUploadDLL.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern int testCSharp(ref myStruct message); 

static void Main() 
{ 
    int result; 

    myStruct message = new myStruct(); 

    message.value1 = "Some randome string"; 
    message.value2 = "0"; 
    message.value3 = "olkujhikvb"; 
    message.value4 = "isabedfbfmlk"; 

    result = testCSharp(ref message); 
} 

her türlü C# dizesi, C# kodu için tanımlanan Cı fonksiyonudur ve bu için suppossed Bu şekilde kalmak, bu yüzden geçirilecek olan yapı hakkında bildiğim tek şey.

Herhangi bir fikrin var mı? peşin

Teşekkür

+0

Ne demek istiyorsun * "C# ile tanımlanan herhangi bir yapı almalı" *? C++ yanı sıra C#, statik olarak yazılmış dillerdir. Yani her tip iki tarafta derleme zamanında bilinir. Ayrıca, her iki taraftaki türlerin tanımları tutarlı olmalıdır, bu nedenle, marshalling herhangi bir sorun olmadan yapılabilir. – Nawaz

+2

"Sizeof" operatörünün sizin düşündüğünüzü yaptığını düşünmüyorum. 'boyut (Test)' döndürür çünkü bir poiner'ın boyutu 4 bayttır (32 bitlik bir makinede). Bu, Testte 4 öğe olduğu anlamına gelmez ... – PoByBolek

+0

@PoByBolek - Bu kodun ne yaptığını anlayamadım çünkü bu "basit" açıklamaları hayal edemezdi. – SChepurin

cevap

2

100'le uzunluğunda ByValTStr olarak sıralanırken konum olarak sana (zaten var olandan herhangi bir daha çalışmak mümkün olacak emin değilim yani birinci eleman). MSDN (here)

Framework ByValTStr türlerinden

bir yapı içinde C tarzı, sabit boyutlu dizeleri gibi davranır (örneğin, kömür kullanıcının [5])

LPStr veya LPWStr boş sonlandırma kullandıysanız, bunların uzunluklarını da kullanabilirsiniz.