MSDN文档的错误:关于UnmanagedType.LPStruct和UnmanagedType.Struct

使用VIVADO 2019.1 搭建以太网接口 以太网 MAC+SGMII->GMII接口转换 以FPGA V7为例,搭建一个千兆以太网接口。运行环境为Vivado2019.1。板卡的FPGA V7与千兆网口芯片采用SGMII互联,最终实现FPGA与上位机之间的千兆网卡通信,实际实现时,V7采用MAC + GMII ->SGMII的结构。SGMII接口使用1G/2.5G Ethernet PCS/PMA or SGMII ip核,MAC层使用Tri Mode Ethernet MAC ip核。 由于MAC层IP不支持SGMII接口,因此需要G 阅读详情

在MarshalAsAttribute中,第一个参数类型是UnmanagedType枚举,用以指定对应的非托管数据类型。在这个枚举类型中,有两个非常诡异的值,Unmanaged.LPStruct和UnmanagedType.Struct。对于这两个枚举值,在MSDN文档中是这么讲的:

Struct

A VARIANT, which is used to marshal managed formatted classes and value types.

LPStruct

A pointer to a C-style structure that you use to marshal managed formatted classes. Valid for platform invoke methods only.

先说Struct,MarshalAs(UnmanagedType.Struct)实际上并不是指定Marshal为Variant。MarshalAs(UnmanagedType.Struct)适用于大部分值类型和object类型(不包括其他引用类型),两种情况下,写和不写都没有区别。当用于值类型的情况下,CLR将对应的值类型转换成对应的非托管类型。而当用于object类型时,CLR则是将object转换成VARIANT。文档中指的当是后一种情况,显然不够准确。其实写不写MarshalAs(UnmanagedType.Struct)基本上没有区别,对于可读性也没有任何的帮助,反而由于文档的错误和两种不同的情况增加了复杂性,因此最好建议不要使用这个枚举值。

比较诡异的是 LpStruct ,从字面上理解是传 Struct 的指针。实际上,这个枚举也只能用在两种情况下:

1.     Guid和Decimal

这里的作用是告诉CLR多加一层引用。比如Guid对应的非托管类型是GUID,而[MarshalAs(UnmanagedType.LpStruct)] Guid的对应的非托管类型则是Guid*,要多一级指针。这个的作用是可以让你避免使用ref Guid(对应的非托管类型也是GUID*),这样可以让函数原型看起来更加自然一些,特别是GUID*只是用来传入的时候。还有就是在特殊的情况下,可以使用[MarshalAs(UnmanagedType.LpStruct)] ref Guid这样的写法来传递GUID**。

2.     一般引用类型,也就是class。和系统关系比较紧密的一些引用类型如String、StringBuilder、数组、委托等除外。

和Guid/Decimal不一样的是,这种情况下写和不写没有区别,,因为class本身就是按引用传递,是有一级指针的。如:

class MyClass
  
{
       int b;
   }

对应的非托管的类型为MyClass*。

由此可见,文档本身并不没有错,但是基本上对编写者没有任何帮助,说了等于没说。

因为LpStruct这个枚举值并不影响可读性,而且在不同情况下行为不一样(不过可以认为是一致的,只是稍微难以理解),文档本身也没有写清楚用途。由于这些原因,以后很有可能CLR Interop小组会慢慢的停止对LpStruct的支持。我的建议是在程序中尽量不要使用LpStruct。

作者:张羿 (ATField)Blog: http://blog.youkuaiyun.com/atfieldEMail: atfield_zhang@hotmail.com 转载请注明出处
OpenClaw实战:拒绝复制粘贴,用 xlsx 技能打通“带公式模板”的月报自动化 本文详解了如何利用 OpenClaw 框架搭载的 xlsx skill,解决 AI 自动化处理“带复杂公式与格式”Excel 月报时极易翻车的业务痛点。针对传统大模型粗暴写入导致模板报废的问题,OpenClaw 创新采用“双核微创”工作流:首先利用 pandas 高效清洗并聚合海量原始明细数据,随后切换至 openpyxl 将计算结果精准注入目标模板,完美保留原有的底色、边框与跨表动态公式。 阅读详情

相关推荐

UnmanagedType 枚举

转自:http://msdn.microsoft.com/zh-cn/magazine/system.runtime.interopservices.unmanagedtype(VS.80).aspx UnmanagedType 枚举 指定如何将参数或字段封送到非托管代码。 命名空间:System.Runtime.InteropServices 程序集:mscorl

shellching的专栏 8466

超越图灵机——论人工智能实现的可能性(一)

超越图灵机——论人工智能实现的可能性(一)我认为人工智能是可以实现到逻辑思维这一步的,因为逻辑思维可以完全用字符串来表示,图灵机可以把任意单元置成任意值,在这一点上是完备的,这就足以描述逻辑思维了,所以用图灵机完全可以实现到逻辑思维。当然图灵机会受到哥德尔不完备性的制约,但是逻辑系统也会受到同样的制约,所以我认为完全可以用图灵机实现逻辑思维。那么逻辑思维的本质机理与图灵机是什么关系?逻辑思

太极语言 1万+

MarshalAs(UnmanagedType···特性是干啥的

[MarshalAs(UnmanagedType.啥啥啥)]是提供向非托管代码封送数据时的规则。MSDN上讲的 MSDN上的说明:(此处不要怀疑Attribute可以省略的) https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.marshalasattribute.-ctor?view=net-5.0 具体举例说明: 比如String或StringBuilder型,传递给非托管代码的时候可能是LPStr

qq_18975227的博客 5462

ABAP BOM展开避坑指南:CS_BOM_EXPL_MAT_V2函数参数配置详解

本文深入解析了SAP ABAP开发中用于物料清单展开的核心函数CS_BOM_EXPL_MAT_V2。针对其复杂的参数配置,如CAPID、STLAN、DATUV和MEHRS,提供了详细的避坑指南和最佳实践,帮助开发者避免数据错误与性能陷阱,实现高效、准确的BOM多层展开。

pea55的博客 850

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

专业解决各种上架过包问题,专业团队专业处理 749

让人混淆的UnmanagedType.LPStruct列集指令(翻译)

原始文献地址:http://blogs.msdn.com/adam_nathan/archive/2003/04/23/56635.aspx 在列集有多种非托管表现形式的托管数据类型时,MarshalAsAttribute属性可以改变列集(Marshaling)行为。一般来说,使用MarshalAsAttribute的难点是如何在它的构造函数里面选择正确的UnmanagedType枚举

Donjuan的专栏 1784

Hermes Agent 桌面版安装部署完全指南:一步步安装自进化Agent智能体

是由开发的开源自主 AI 智能体(MIT 协议)。它不是绑定在集成编辑器上的编码助手,也不是围绕单一 API 的聊天机器人封装——它是一个越用越强大的自主智能体,拥有独一无二的闭环学习系统特性说明自主技能创建在复杂任务后自动生成可复用的 Skills(技能)技能自我改进使用过程中持续优化已有技能持久化记忆跨会话记住你的项目、偏好和解决方案用户画像建模通过 Honcho 方言式推理,逐步构建对你的深度理解20+ 平台接入。

大模型与Agent智能体 7752

C# 结构使用

上位机(C#)需要和单片机通过串口传输数据,本人也是踩了几个坑之后才将该功能实现,时间比较匆忙,写的潦草,有不清楚的可以追问。 单片机上已经定义好了接口和数据格式(结构) 上位机上处理方法: 1、串口接收到byte数组,从数组中按下标获取 如果数据结构单一这个方法未尝不可,如果数据结构较多,结构体较大 那么需要认真的计算下标,否则很容易出现问题,且不易维护。 例如: private...

yi_tianchou的博客 1870

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)、使用plot函数可视化训练好的条件推理决策树、条件推理决策树的叶子节点的阴影区域表示的是阳性样本的比例

data+scenario+science+insight 1223

使用Simulink来模拟多旋翼无人机在风扰动条件下的飞行情况,并分析其稳定性

本教程详细介绍了使用Simulink进行多旋翼无人机风扰动稳定性分析的完整流程。首先构建包含飞行器动力学模型、控制系统和环境模拟模块的系统框架,重点讲解简化动力学方程的实现方法。随后指导设计PID控制器来维持姿态稳定,并添加随机风扰动模型模拟环境干扰。通过设置输入信号和输出显示,最终实现对不同风速条件下无人机控制性能的评估。该实例为无人机控制系统设计提供了实用的仿真方法,强调利用MATLAB工具进行可视化分析和参数优化,以提高系统抗干扰能力和稳定性。

amy_mhd的博客 418

MarshalAs的简单总结

作用: MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。 使用方法: [MarshalAs(UnmanagedType unmanagedType, 命名参数)] 实际上相当于构造一个MarshalAsAttribute类的对象 常用的UnmanagedType枚举值:(详细内容查MSDN) BStr 长度前缀为双字节的 Unicode 字符串; LPStr 单字节、空终止的 ANSI 字符串。; LPWStr 一个 2 字节、空终止的 Unicode 字符串; ...

钢铁男儿 6676

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C# Struct结构体里数组长度的指定

本文转载连接: https://www.cnblogs.com/jhlong/p/5842213.html   typedef struct Point{     unsigned short x;     unsigned short y; }mPoint;//点坐标   typedef struct Line{       mPoint p[2];       unsigne...

newbie的博客 8271

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

UnmanagedType 枚举 - 指定如何将参数或字段封送到非托管代码

成员名称 说明 AnsiBStr 长度前缀为单字节的 ANSI 字符串。可以在 String 数据类型上使用此成员。  AsAny 一个动态类型,将在运行时确定对象的类型,并将该对象作为所确定的类型进行封送处理。仅对平台调用方法有效。  Bool 4 字节布尔值(true != 0、false = 0)。这是

ybhjx的专栏 3562

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C#中使用本地数据类型 MarshalAs

     接口函数的定义中用到了许多MarshalAs,这是C#与本地数据类型的转换。    《COM本质论》中给出了一张表,列举了所有的需要转换和C#自动转换的数据类型。看下代码中用到的:     无需转换:uint、Guid      需要转换:     [MarshalAs(UnmanagedType.Interface)]object     [MarshalAs(UnmanagedType.Struct)]object     [MarshalAs(UnmanagedType.LPWStr)]

tianyu0910的专栏 1万+

C#调用C++DLL 数据类型转换

//c++:HANDLE(void   *)          ----    c#:System.IntPtr          //c++:Byte(unsigned   char)     ----    c#:System.Byte          //c++:SHORT(short)              ----    c#:System.Int16          //

mybloglucis009的专栏 821

.NET的基元类型包括哪些?Unmanaged和Blittable类型又是什么?

从该方法的实现和CorElementType的枚举成员也可以看出,枚举值2-13,外加CorElementType.I(IntPtr)和CorElementType.U(UIntPtr)这14个类型属于基元类型的范畴,这与上面的列表是一致的。在讨论.NET的类型系统的时候,我们经常提到“基元类型(Primitive Type)”的概念,我发现很多人并没有真正理解基元类型就究竟包含哪些(比如很多人觉得字符串是基元类型)。顾名思义,Unmanaged类型可以理解不涉及托管对象引用的值类型。

chengxuyuanlaow的博客 1313

C# 调用C++动态库异常闪退解决

因为牵涉到安全性,所以只放关键部分代码 //申明DLL加载方法 [DllImport("*.dll", CallingConvention = CallingConvention.StdCall)] public static extern int business_handle(IntPtr inputvalue, int outputlen, [MarshalAs(UnmanagedType.LPStr)]StringBuilder outputdata, [MarshalAs(UnmanagedT.

Warren专栏 4927

MarshalAs(UnmanagedType.U4)

MarshalAs:指示如何在托管代码和非托管代码之间封送数据。

紫冰寒寞的专栏 9576

C#: 结构体 struct 应用笔记

说明:记录 在 C# 中的一些结构体相关的应用

yutian0606的博客 1604

从C#程序中调用非受管DLLs

<br />   从所周知,.NET已经渐渐成为一种技术时尚,那么C#很自然也成为一种编程时尚。如何利用浩如烟海的Win32 API以及以前所编写的 Win32 代码已经成为越来越多的C#程序员所关注的问题。本文将介绍如何从C#代码中调用非受管DLLs。如果某个函数是一个带有串类型(char*)输出参数的 Win32 API 或者是DLL输出函数,那么从C#中如何调用它呢?对于输入参数的情形问题到不大,但如何获取从参数中返回的串呢?此外,如何调用有结构(struct) 和回调(callbac

老汉--小庙和尚 2549

MarshalAs的使用

参考:http://blog.sina.com.cn/s/blog_4e4ee8ed0100elou.html 作用: MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。 使用方法: [MarshalAs(UnmanagedType unmanagedType, 命名参数)] 实际上相当于构造一个MarshalAsAttribute类的对象 常用的Unmanaged

白永辉的专栏 2万+

c#尝试写入或者读取受保护的内存_C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。错误类型为:System.AccessViolationException。...

报错 dll文件应该是C++写的。封装了之后供我的C#程序调用,结果就提示了错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。错误类型为:System.AccessViolationException。解决办法 在C#中调用别人的DLL的时候有时候出现尝试读取或写入受保护的内存。这通常指示其他内存已损坏。在传值的时候还是用指针,再在C#中做转换就好了。[DllImport("APPL...

weixin_39777163的博客 3928

c#调用C++库

c#调用C++库 GCHandle IntPtr AddrOfPinnedObject UnmanagedFunctionPointer CallingConvention DllImport MonoPInvokeCallback

树莓吃的累 3912
上一篇: TlbImp源码在CodePlex公开!欢迎下载
下一篇: ATL:IDispatchImpl, IDispEventImpl, IDispEventSimpleImpl的区别和联系
ATField
博客等级 码龄25年 673粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值