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
DLLextern 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
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
"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
@PoByBolek - Bu kodun ne yaptığını anlayamadım çünkü bu "basit" açıklamaları hayal edemezdi. – SChepurin