草庐IT

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# - 检测设备是否使用 USB 3.0

有谁知道使用C#检测连接到USB3.0主机端口的USB设备是运行在3.0还是2.0的方法?我们正在制造USB3.0延长线,我们需要验证所有引脚是否已正确焊接。我们想在软件中做到这一点。我们想将3.0拇指驱动器连接到电缆并检查设备是否在USB3.0模式下运行。如果它处于2.0模式,我们知道它们是1条或多条USB3.0线的问题。 最佳答案 在一些源代码的帮助下,我设法制作了一个工作演示Ifound.privatestaticvoidMain(string[]args){varhostCtrls=USB.GetHostController

c# - 如何使用 PFX(Bouncy CaSTLe 或其他)以编程方式对可执行文件进行代码签名

我正在尝试确定使用BouncyCaSTLe、托管代码或来自C#的非托管代码对可执行文件进行代码签名的最佳方法。由于CAPICOM现在已被弃用,我想如果需要非托管地完成,mssign32.dll中的SignerSign方法之一是最好的方法。这个答案(https://stackoverflow.com/a/3952235/722078)看起来很接近,但它会生成一个.p7m文件,虽然看起来大小合适,但无法正确运行(显然在运行前重命名为.exe)。此处提问者(API/Librarytoreplacesigntool.exe)给出的解决方案似乎很有前途且管理得当,但就像TomCanham在下面的

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

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

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

c# - 是否有可能拦截(或意识到)COM 对暴露给 COM 的 CLR 对象的引用计数

我已经改写了这个问题。当.net对象通过COM迭代操作暴露给COM客户端时,将创建一个CCW(COMCallableWrapper),它位于COM客户端和托管.net对象之间。在COM世界中,对象会记录其他对象对它的引用数。当引用计数变为零时,对象将被删除/释放/收集。这意味着COM对象终止是确定性的(我们在.net中使用Using/IDispose来确定性终止,对象终结器是非确定性的)。每个CCW都是一个COM对象,并且它像任何其他COM对象一样被引用计数。当CCW终止(引用计数变为零)时,GC将无法找到CCW包装的CLR对象,并且CLR对象符合收集条件。快乐的日子,世界上一切都好。