我正在读关于Marshaling的事.我很困惑,因为在非托管代码中这意味着什么.HRESULT,DWORD和HANDLE.原文是:
您已经知道托管和非托管环境之间没有这种兼容性.换句话说,.NET不包含存在于非托管代码领域中的类型HRESULT,DWORD和HANDLE.因此,您需要找到.NET替代品或根据需要创建自己的替代品.这就是所谓的编组.
我有两个几乎相同代码的例子.我可以从C#中检索一个数据,但我没有为另一个人提供正确的数据.他们来了:
效果很好
C++部分:
__declspec(dllexport) void** enumerateDevices(int *dIsize){
Array<DeviceInfo> dIArray;
Framewoek::enumerateDevices(&dIArray);
*dIsize = dIArray.getSize();
DeviceInfo dP[255];
for (int i = 0; i < dIArray.getSize(); i++)
dP[i] = dIArray[i];
void* p = dP;
return &p;
}
Run Code Online (Sandbox Code Playgroud)
C#部分:
[DllImport("Wrapper.dll")]
static extern IntPtr enumerateDevices(out int devicesSize);
public static DeviceInfo[] EnumerateDevices()
{
int devicesSize;
IntPtr arrayPointer = enumerateDevices(out devicesSize);
IntPtr[] array = new IntPtr[devicesSize];
Marshal.Copy(arrayPointer, array, 0, devicesSize);
DeviceInfo[] arrayObjects = new DeviceInfo[devicesSize];
for (int i = 0; i < devicesSize; i++)
arrayObjects[i] = new …Run Code Online (Sandbox Code Playgroud) 我能够通过装饰它成功地将引用类型对象从 C# 传递到 C++StructLayout(LayoutKind.Sequential)
C# 中的类:
StructLayout(LayoutKind.Sequential)
public class Point
{
[DataMember]
public double X { get; set; }
[DataMember]
public double Y { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
C++ 中的等价物:
struct Point
{
public:
double x;
double y;
};
Run Code Online (Sandbox Code Playgroud)
C++中的函数体:
extern "C" __declspec(dllexport) void Translate(Point* pt, double dx, double dy)
{
pt->x += dx;
pt->y += dy;
}
Run Code Online (Sandbox Code Playgroud)
以及 C# 中的等效项:
[DllImport("myDll.dll", CallingConvention = CallingConvention.Cdecl)]
public extern static void Translate(Point pt, double dx, double dy);
Run Code Online (Sandbox Code Playgroud)
到目前为止我没有遇到任何问题,当我在接下来的两个函数之间传递这些点的数组时,问题就会发生:
extern "C" __declspec(dllexport) …Run Code Online (Sandbox Code Playgroud) 我想以JSON格式获取CF命令的输出,但是我不确定该使用json.Marshal还是json.MarshalIndent。
我需要的输出是这样的:
{
"key1": "value1",
....
"keyn": "valuen",
}
Run Code Online (Sandbox Code Playgroud)
这是旧示例,但不是所需的输出:
cmd.ui.Say(terminal.EntityNameColor(T("User-Provided:")))
for _, key := range keys {
// cmd.ui.Say("%s: %v", key, envVars[key])
here needed a new one with json.marshalIdent
}
Run Code Online (Sandbox Code Playgroud)
我从来没有使用过go,所以我真的不知道该使用哪个以及如何使用。
注意:myjsonstruct是从数据库中存储和读取的.硬编码为清晰起见
myjsonstruct := `{"fldA":"", "fldB":"", "fldC":""}`
targetJsonString := `{"fldA":"valueA","fldB":"valueB","fldC":"valueC","fldOther":"valueOther"}`
Run Code Online (Sandbox Code Playgroud)
现在,我想解组targetJsonString成myjsonstruct的,这样相应的字段中myjsonstruct填入搞定.
请注意:myjsonstruct是一个"字符串",无法在代码中编程.我在编码时不知道这个结构.它将在运行时读取为字符串,可能来自数据库.
谢谢!
在尝试解析时间序列数据时,我发现 JSON 数据中的一个关键字段是时间戳(显然是字符串格式)。但是事先为相同的结构创建一个结构是不可能的,因为无论如何我都不知道时间戳字符串。
这是 JSON 的样子:
"Time Series (5min)": {
"2020-01-17 16:00:00": {
"1. open": "167.2000",
"2. high": "167.3400",
"3. low": "167.0100",
"4. close": "167.0500",
"5. volume": "1646699"
},
"2020-01-17 15:55:00": {
"1. open": "166.9000",
"2. high": "167.1600",
"3. low": "166.8500",
"4. close": "167.1500",
"5. volume": "622999"
},
"2020-01-17 15:50:00": {
"1. open": "166.7241",
"2. high": "166.9200",
"3. low": "166.7200",
"4. close": "166.8999",
"5. volume": "271723"
}
}
Run Code Online (Sandbox Code Playgroud)
有些人的结构可能如下所示:
type TIMESTAMP struct {
Open string `json:"1. open"`
High string `json:"2. …Run Code Online (Sandbox Code Playgroud) 我想要的结果如下\xef\xbc\x8c,但Rust的结果是另一个。
\n [123 34 66 111 100 121 34 58 34 97 71 86 115 98 71 56 61 34 125]\nRun Code Online (Sandbox Code Playgroud)\n戈兰样本:
\ntype Response struct {\n Body []byte\n}\nfunc Test_Marshal(t *testing.T) {\n body := "hello"\n resp := &Response{\n Body:[]byte(body),\n }\n t.Log("resp:", resp)\n result, _ := json.Marshal(resp)\n t.Log("result: ", result)\n}\nRun Code Online (Sandbox Code Playgroud)\n去结果:
\n aa_test.go:17: resp: &{[104 101 108 108 111]}\n aa_test.go:19: result: [123 34 66 111 100 121 34 58 34 97 71 86 115 98 71 56 61 34 …Run Code Online (Sandbox Code Playgroud)