[StructLayout = LayoutKind.Sequential]
public struct A
{
...
...
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public B[] b
}[StructLayout = LayoutKind.Sequential]
public struct B
{
...
...
}[DllImport("...")]
public static extern int Test(..., [In, Out] ref A[] a);我跟踪到Dll里调试的时候发现结构A中的数组b中的值全部丢掉了,而且在Dll里面为a赋值也都传不出来,请问在调用外部DLL时传递这种较为复杂的结构的数组该如何封送结构?谢谢!
public struct A
{
...
...
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public B[] b
}[StructLayout = LayoutKind.Sequential]
public struct B
{
...
...
}[DllImport("...")]
public static extern int Test(..., [In, Out] ref A[] a);我跟踪到Dll里调试的时候发现结构A中的数组b中的值全部丢掉了,而且在Dll里面为a赋值也都传不出来,请问在调用外部DLL时传递这种较为复杂的结构的数组该如何封送结构?谢谢!
解决方案 »
- 一个泛型应用示例:将一组已经排序的条形码按照"相邻编号连续"分组
- (答案满意加到100分)涉及到 GIS 经纬度坐标的几个问题,帮帮忙解决一下,偶不会已经好几天没有弄出来了
- 哪位知道从string数据中的字符,无重复的任意排列字符.
- 简单提问=直接送分
- 将数字1234格式化成8位长度"00001234"怎么做?
- .net 2003安装不上,错误日志显示如下:
- 程序中怎么样添加东西到鼠标右键里面啊
- c#关于多个Panel显示的问题
- 在串口通信中,给设备发送命令,DataReceive为什么要分两次来接收数据
- 请问怎样让鼠标到达指定的坐标?
- 如何在C#中调用多参数(全部是Input,两个以上)的存储过程?急!!
- winform里树形(treeview):增加,删除,修改,保存,多选,急求源码,100分相送.谢谢.
{
...
...
}typedef struct
{
...
...
B b[10];
} A;extern "C" __declspec(dllexport) int Test(..., A *a);
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10,ArraySubType =UnmanagedType.Struct)]
public B[] b另外你的调用的代码不知道是否有错,最好也贴出来好运!
1、单一化不可行,目前我们系统中的很多地方都是需要与其他公司对接的,我们不可能要求其他公司来修改他们定义的接口中的结构,当然,我们可以在其他公司的Dll之上再自己用VC++再包一层,将结构中的元素单一化,但类似的接口很多,还有不少比上面写的更复杂的结构,结构里嵌结构嵌了四五层,如果这样做的话,工作量很大,而且代码维护起来也很困难。
2、在结构上增加ArraySubType属性的方法我也试过了,系统报错“无法封送类型 B 的字段 b:该类型无法作为结构字段进行封送处理。”
3、调用的代码应该没有问题,结构中所有的字段的值都赋了初始值,跟踪调试的时候在C#中都是正确的
4、MSDN里的那个例子我看过了,但那个传递的只是“具有嵌入结构的结构”,而我们现在要解决的是“具有嵌入结构的结构的数组”
谢谢!To Tony_lau111082(刘寓)
C++中的结构和函数的定义在2楼
DOTNET下还弄结构,实在是太费力了。
C#代码:
using System;
using System.Runtime.InteropServices;namespace TestDll
{
[ StructLayout( LayoutKind.Sequential) ]
public struct A
{
public int a;
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10, ArraySubType = UnmanagedType.Struct)]
public B[] b;
} [ StructLayout( LayoutKind.Sequential) ]
public struct B
{
public int a;
public int b;
} [ StructLayout( LayoutKind.Sequential) ]
public struct C
{
public int a;
public B b;
} public class Class1
{
const string DLL_PATH = @"D:\Test\Debug\Test.dll"; [DllImport(DLL_PATH)]
public static extern int Test([In, Out] ref A[] a); [DllImport(DLL_PATH)]
public static extern int TestA([In, Out] ref A a); [DllImport(DLL_PATH)]
public static extern int TestB(B[] b); [DllImport(DLL_PATH)]
public static extern int TestC(C c); [DllImport(DLL_PATH)]
public static extern int TestBB(B[,] b);
}
}C++中.h文件的代码:
typedef struct
{
int a;
int b;
} B;typedef struct
{
int a;
B b[10];
} A;typedef struct
{
int a;
B b;
} C;extern "C" __declspec(dllexport) int Test(A *a);extern "C" __declspec(dllexport) int TestA(A& a);extern "C" __declspec(dllexport) int TestB(B *b);extern "C" __declspec(dllexport) int TestC(C c);extern "C" __declspec(dllexport) int TestBB(B **b);在.Net环境下启用非托管调试跟踪时发现:
调用TestB、TestC均能正确传值,调用Test、TestA、TestBB时进到C++中时b中的值都乱了,传递结构的多维数组时也不能正确的取到值,如果为A结构中的b添加[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10, ArraySubType = UnmanagedType.Struct)]属性修饰,则在调用Test的时候就出异常了
private void button2_Click(object sender, System.EventArgs e)
{
A[] a = new A[2]; a[0].a = 1;
a[0].b = new B[10]; for (int i = 0; i < 10; ++i)
{
a[0].b[i].a = i;
a[0].b[i].b = 10 - i;
} a[1].a = 2;
a[1].b = new B[10]; for (int i = 0; i < 10; ++i)
{
a[1].b[i].a = 10 - i;
a[1].b[i].b = i;
} Class1.Test(ref a);
}private void button3_Click(object sender, System.EventArgs e)
{
A a; a.a = 5;
a.b = new B[10]; for (int i = 0; i < 10; ++i)
{
a.b[i].a = i;
a.b[i].b = 10 - i;
} Class1.TestA(ref a);
}private void button4_Click(object sender, System.EventArgs e)
{
C c; c.a = 5;
c.b.a = 10;
c.b.b = 10; Class1.TestC(c);
}private void button5_Click(object sender, System.EventArgs e)
{
B[] b = new B[10]; for (int i = 0; i < 10; ++i)
{
b[i].a = i;
b[i].b = 10 - i;
} Class1.TestB(b);
}private void button6_Click(object sender, System.EventArgs e)
{
B[,] b = new B[10, 10]; for (int i = 0; i < 10; ++i)
{
for (int j = 0; j < 10; ++j)
{
b[i, j].a = i;
b[i, j].b = j;
}
} Class1.TestBB(b);
}
http://www.dotnet247.com/247reference/msgs/29/147905.aspx
然后采用了http://blog.sunmast.com/sunmast/archive/2005/04/19/1739.aspx中的解决方法,但测试后发现该文档中的解决方法还是不能正确的传递“包含了结构数组的结构”的数组,只能传递单个“包含了结构数组的结构”,看来我目前只能用VC++再包一层,对上面的“包含了结构数组的结构”的数组将其分开一个一个的传了。非常感谢Jim3(Jim) !
然后用我写的那个Struct2Bytes方法传入
[ StructLayout( LayoutKind.Sequential) ]
public struct A
{
public int a;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 80, ArraySubType = UnmanagedType.U1)]
public B[] b;
}
在构造A数组的时候我调用了Struct2Bytes方法不知道 Sunmast 有没有做过类似的测试
public struct A
{
public int a;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = xxx, ArraySubType = UnmanagedType.U1)]
public byte[] b;
}
算了,反正这个问题用其他方法也勉强能够解决,结贴吧
谢谢各位朋友!