我们必须大量地与本机代码进行互操作,在这种情况下,使用不需要封送处理的不安全结构要快得多。但是,当结构包含非原始类型的固定大小缓冲区时,我们不能这样做。为什么C#编译器要求固定大小的缓冲区仅为原语类型?为什么不能用结构来构成固定大小的缓冲区,例如:
[StructLayout(LayoutKind.Sequential)]
struct SomeType
{
int Number1;
int Number2;
}
我正在尝试使用pinvoke将C结构封送到C#。虽然我能够封送intptr,但无法找到封送双指针的语法。在C端,int指针和双指针都用于分配一个int数组或双指针。
这里是C结构:
struct xyz
{
int *np; // an int pointer works fine
double *foo;
};
下面是c#类:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class xyz
{
Intptr np; // works fine
I有以下C#代码,包括结构定义(CInput)、obj定义和init,以及对C++ (本机) DLL函数的调用(该函数也是由我编写的)。
//C# code
public struct CInput
{
[MarshalAsAttribute(UnmanagedType.R8)]
public double Time;
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_R8)]
public double[] Database;
/* other similar fields*/
如何使用另一个结构的固定大小数组在C#中声明结构?我需要声明,这样它才能工作。或者如果我想要创建bitmapinfo (-header),那么我的方法是错误的吗?
[StructLayout(LayoutKind.Sequential)]
public struct RGBQUAD
{
public byte b;
public byte g;
public byte r;
public byte reserved;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFO
{
p
我有一个在C++中定义的结构,它包含int和std::string数组,这是一个本机C++代码(dll)。我使用了以下方法在C#中获取它:
public class PInvokeData
{
[StructLayout(LayoutKind.Sequential)]
public struct pinvoke_call
{
//[MarshalAs(UnmanagedType.LPArray,SizeConst=5,SizeParamIndex=0,MarshalType="int")]
[Marshal
我想封送二维数组
int [10][20] //const dimensions size
从C++动态链接库到C#代码。有自动封送拆收器吗?对于如此简单的任务,找不到好的解决方案。
public int[,] _operators;
给出未定义的值。是的,我可以将其设置为一维,仅用于编组,然后在C#中再次读取到2维,但有自动简单的方法吗?
=================
我认为最好的方法是像这样使用指针:
const int 1dSize = 10;
const int 2dSize = 10;
var re
我应该如何处理封送数组散列?下面的代码只打印{}。
s = Hash.new
s.default = Array.new
s[0] << "Tigger"
s[7] << "Ruth"
s[7] << "Puuh"
data = Marshal.dump(s)
ls = Marshal.restore( data )
p ls
如果哈希不包含数组,则将正确还原该数组。
如何将数据解压缩成地图?
JSON是一个对象列表,我希望在解封送处理过程中将其转换为映射。但是,初始化映射似乎会创建一个未正确返回的新对象。
type foo struct {
Id string `json:"id"`
Name string `json:"name"`
}
type fooList []*foo
type fooMap map[string]*foo
func (f fooMap) UnmarshalJSON(data []byte) error {
f := fooMap{} // required since
我想封送一个用于P/Invoke的结构,但是这个结构包含一个只与我的托管代码相关的字段,所以我不希望它被封送,因为它不属于本机结构。这有可能吗?我一直在寻找类似于NonSerialized的属性来进行序列化,但它似乎并不存在……
struct MyStructure
{
int foo;
int bar;
[NotMarshaled] // This attribute doesn't exist, but that's the kind of thing I'm looking for...
int ignored;
}
如有任何建议