C# 迭代从c传递的未知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

我正在开发一个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(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);
}