草庐IT

Marshal3

全部标签

windows - 为 COM 接口(interface)启用编码(marshal)处理需要什么?

我有一个没有类型库的32位ATLCOM组件。它有一个类工厂,用于一个实现多个接口(interface)的给定类。当我将它用作进程内服务器时,一切正常-客户端调用CoCreateInstance(),对象被实例化,QueryInterface()检索指向所请求接口(interface)的指针。但是,当我将组件放入COM+时,我无法再实例化该类-CoCreateInstance()现在返回E_NOINTERFACE。我认为问题在于COM+无法执行编码(marshal)处理,因为缺少类型库-它不知道如何执行。我需要生成并注册一个类型库来解决这个问题还是有其他方法?

c# - 调用 Marshal.PtrToStructure 时出现 AccessViolationException

我通过调用Marshal.PtrToStructure(intPtr,typeof(Servent))得到一个AccessViolationExcpetion。任何想法我做错了什么?我在x64上试过这个。IntPtrintPtr=NativeMethods.GetServByName(name,"tcp");if(intPtr!=IntPtr.Zero){Serventservent=(Servent)Marshal.PtrToStructure(intPtr,typeof(Servent));result=System.Convert.ToInt32(IPAddress.Networ

c# - 如何绕过 Marshal.Copy(32 位)长度限制?

我正在尝试在托管(C#)和非托管(C++Win32)代码之间来回移动数据。我可以使用Marshal.Copy它工作正常,直到数据集变大>2GB因为Marshal.Copy有一个带符号的32位int(2GB)长度限制。知道如何解决这个问题吗?目前,我在托管端使用AllocHGlobal(IntPtr),在非托管端使用.ToPointer()。如果我不能使用Marshal.Copy来回移动大数据(>2GB)我可以使用什么? 最佳答案 我的第一react是:为什么要复制2GB以上的数据?也许您的应用程序约束不允许这样做,但在我看来,如果您

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# - 什么时候需要在 C# 中通过 COM 查询的接口(interface)上调用 Marshal.ReleaseComObject

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

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

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

c# - 我是否需要删除非托管代码中通过 Marshal.PtrToStructure 编码(marshal)的结构?

我有这个C++代码:extern"C"__declspec(dllexport)VOIDAllocateFoo(MY_DATA_STRUCTURE**foo){*foo=newMY_DATA_STRUCTURE;//dostufftofoo}然后在C#中我这样调用函数:[DllImport("MyDll.dll")]staticexternvoidAllocateFoo(outIntPtrpMyDataStruct);...MyDataStructureGetMyDataStructure(){IntPtrpData;ManagedAllocateFooDelegate(outpDat

c# - Marshal.GetActiveObject() 在 C# 中抛出 MK_E_UNAVAILABLE 异常

下面的vbscript代码工作得很好:DimAppSetApp=GetObject("","QuickTest.Application")App.Quit但是当我将它翻译成如下C#代码时:classProgram{[STAThread]staticvoidMain(string[]args){objectqtApp=Marshal.GetActiveObject("QuickTest.Application");(qtAppasQuickTest.Application).Quit();}}我得到异常:mscorlib.dll中发生类型为“System.Runtime.InteropS

c# - 了解使用固定{}、Marshal.AllocHGlobal() 和 GCHandle.Alloc() 之间的区别

首先我要说的是,我在整个论坛和网络上的许多链接中查看并找到了有关使用fixed{}、Marshal.AllocHGlobal()和GCHandle.Alloc()的描述。但是,我还没有找到关于何时使用Marshal类与GCHandle类(使用和不使用fixed{})的简明解释。我正在使用第三方.NET库,它在“Buffer”类中有一个名为Readline()的方法。手册显示了以下函数原型(prototype):boolReadLine(intx1,inty1,intx2,inty2,System.IntPtrbufData,outintnumRead);bufData的描述如下:...

c# - 在 C# 中使用 Marshal.StructureToPtr 将结构传递给 C++ API

我在我的代码中使用用C++编写的API(用C#编写)。API需要一个参数作为指向结构的指针。该结构由“Int”和Char数组组成:例如unsafepublicstructToBePassed{Int32Num1;Int32Num2;Char[]Data;//orfixedCharData[255];}我不能直接将结构指针传递给API,因为在那种情况下,我会收到“指针无法引用编码(marshal)结构”的错误。代码编译成功,但是当我执行(调试)代码时出现此错误。现在我有两个选择:第一:-通过引用传递结构:我想问一下,当我通过引用传递结构时,需要结构指针的API是否可以接收地址。请注意,A