C# 迭代从c传递的未知c结构#
我正在开发一个c.dll,可以从c#程序访问它。理想情况下,.dll应该接收C#中定义的任何结构,并对其进行处理。因此,最初,C dll的结构类型和大小是未知的。我能够通过C extern函数传递这个结构,它被接收是正常的,但是,有没有办法找出这个接收结构的大小和特性?有没有一种方法可以迭代它的成员 这是为dll定义的C函数C# 迭代从c传递的未知c结构#,c#,c++,dll,struct,iteration,C#,C++,Dll,Struct,Iteration,我正在开发一个c.dll,可以从c#程序访问它。理想情况下,.dll应该接收C#中定义的任何结构,并对其进行处理。因此,最初,C dll的结构类型和大小是未知的。我能够通过C extern函数传递这个结构,它被接收是正常的,但是,有没有办法找出这个接收结构的大小和特性?有没有一种方法可以迭代它的成员 这是为dll定义的C函数 extern int __cdecl testCSharp(mystruct * Test){ //sizeof(Test) is 4, so it is ok for
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;
所有类型都是C#中的字符串,并且不支持保持这种状态,因此我只知道要传递的结构
有什么想法吗
提前感谢当您将它们编组为长度为100的ByValTStr时,我不确定您是否能够比现有的(即第一个元素)工作更多 来自MSDN() .NET Framework ByValTStr类型的行为类似于C样式、固定大小的字符串 结构内部(例如,char s[5])
如果您使用LPStr或LPWStr null终止,您将能够计算出它们的长度。您所说的“应该接收C#中定义的任何结构”是什么意思?C++和C语言都是静态类型语言。因此,每种类型在编译时都是已知的。此外,两边类型的定义应该是一致的,因此编组可以毫无问题地完成。我不认为
sizeof
操作符做您认为它做的事情sizeof(Test)
返回4,因为poiner的大小是4字节(在32位机器上)。这并不意味着测试中有4项…@PoByBolek-我无法理解这段代码在做什么,因为我无法想象这个“简单”的解释。
[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);
}