草庐IT

marshalling

全部标签

c# - 如何使用 C# 获取 char**?

这个问题在这里已经有了答案:MarshalanarrayofstringsfromC#toCcodeusingp/invoke(2个答案)C#callC++DLLpassingpointer-to-pointerargument(3个答案)关闭6年前。我需要以以下形式将参数传递给不安全的DllImported函数:[DllImport("third_party.dll")]privatestaticexternunsafeintstart(intargc,char**argv);我假设它是一个字符串数组。但是,当我尝试执行以下操作时,出现“无法从字符串[]转换为char**”错误。我该

c# - P/调用,c# : unsigned char losing a byte

我正在为软件的SDK编写一个dll文件,我正在尝试调用一个函数来获取有关软件主机的信息。函数想要的结构中有两个无符号字符变量(HostMachineAddress,HostProgramVersion),当我尝试从c#调用它时,我似乎“松开了”最后一个字节...如果我更改c#中的SizeConst结构低于5我确实得到了丢失的字节,但是它导致另一个变量丢失数据。有人可以帮我找到解决这个问题的方法吗?还尝试使用类而不是结构导致system.stackoverflow错误C#结构[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)

c# - 包含 guid 的结构上的 Marshal.SizeOf 提供额外的字节

我有几个具有顺序布局的结构:structS1{Guidid;}structS2{Guidid;shorts;}structS3{Guidid;shorts;shortt;}在上述结构类型上调用Marshal.SizeOf,我得到了:Size:S1=16,asexpected.S2=20,copiedaninstancetoabytearray,itonlyoccupiesfirst18bytes.S3=20.我的问题是,为什么S2的大小是20而不是18。只有当Guid在结构中时才会出现这个问题。很抱歉无法从msdn中找到任何有用的信息。我知道Marshal.SizeOf给出了该类型在内

c# - byte[] array to struct with variable length 数组

我正在从套接字接收一个字节数组,字节的结构只是一个固定宽度字符串的大字符数组。在某些情况下,最后一个字段是动态的(而不是固定长度),我正在尝试将字节编码为结构。我读过可变长度的char数组需要是IntPtr,但我还没有弄清楚如何用剩余的字节对其进行编码。我还在一些文章中读到我可能需要第二个结构,但仍然无法弄清楚如何正确地编码它。这是一个这样的site在结构中处理可变长度字符数组的正确方法是什么?结构:[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]publicstructHeader{#regionprivatemem

c# - 通过 C# 中的 COM RCW 对象检测跨线程编码

我正在处理大量COM互操作的大型多线程C#应用程序中工作。其他开发人员和我有足够的机会不小心调用Single-ThreadedApartment(STA)来自MTA线程的COM对象,以及来自它们不是在其上创建的STA线程的COM对象。性能低下,跨线程编码是主要嫌疑人。是否有测试跨公寓编码的好方法?更好的是,是否有一种防御性编程技术来测试给定的COM对象是否属于该线程的单元?我最接近的是在可疑代码周围放置一个断言语句:Debug.Assert(Thread.CurrentThread.GetApartmentState()==ApartmentState.STA);suspiciousC

c# - Marshall 结构数组

我花了很多时间寻找解决方案,但仍然没有找到。我有2个类:[StructLayout(LayoutKind.Sequential)]publicclassResult{publicintNumber;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=4)]publicstringName;publicintSize;}[StructLayout(LayoutKind.Sequential)]publicclassCoverObject{publicintNumOfResults;[MarshalAs(UnmanagedType.ByValArray

c# - 什么时候需要在 C# 中通过 COM 查询的接口(interface)上调用 Marshal.ReleaseComObject

我一直在使用一些DirectShow接口(interface)来使用C#和DirectShow.Net播放数字电视(DVB-T).我最近遇到运行时错误COMobjectthathasbeenseparatedfromitsunderlyingRCWcannotbeused.此错误发生在以下行中:_guideData=_transportInformationFilterasIGuideData;_transportInformationFilter属于IBaseFilter类型,这是一个先前通过DirectShow.Net实用程序函数分配的COM对象。我假设错误是由于_transpor

c# - MessageBox.Show() 是否自动编码到 UI 线程?

我通过ThreadPool.QueueUserWorkItem启动一个线程,其中有一个消息框对话框:System.Windows.Forms.DialogResultdr=System.Windows.Forms.MessageBox.Show("wouldyouliketodownloadupgradeinbackground?..","UpgradeAvailable",MessageBoxButtons.YesNo);它似乎工作正常,但我有点怀疑,因为一些客户表示他们没有收到弹出的消息。我在.NETFramework2.0+中感觉您不需要编码这个特定的调用,它会为您完成。正确吗?

c# - 我可以告诉 CLR 通过引用在 AppDomain 之间编码(marshal)不可变对象(immutable对象)吗?

当在.NET中的AppDomain之间编码(marshal)对象时,CLR将序列化对象(如果它具有Serializable属性)或生成一个代理(如果它继承自MarshalByRef)然而,对于字符串,CLR只会将对字符串对象的引用传递到新的AppDomain中。CLR仍然确保完整性,因为.NET字符串是不可变的,并且第二个AppDomain对字符串的任何更改都不会影响原始对象。这让我想到了我的问题:有没有办法告诉CLR我的自定义类型是不可变的,并且当用于远程处理时,它应该只传递对对象的引用,就像它对字符串类所做的那样? 最佳答案 编

c# - 将结构数组转换为 IntPtr

我正在尝试将RECT结构的数组(如下所示)转换为IntPtr,以便我可以使用PostMessage将指针发送到另一个应用程序。[StructLayout(LayoutKind.Sequential)]publicstructRECT{publicintLeft;publicintTop;publicintRight;publicintBottom;//lotsoffunctionssnippedhere}//sowehavesomethingtosend,inrealityIhaverealdatahere//also,thelengthofthearrayisnotconstantR