- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已阅读 Marshal.GetIUnknownForObject
的文档它说:
Always use
Marshal.Release
to decrement the reference count once you have finished with the pointer.
我用 COM 对象编写了一个测试解决方案,我通过 .NET 使用它,我在使用 wrapper 时看到了这一点对于我的 COM 对象,Marshal.GetIUnknownForObject
和 Marshal.Release
都不会导致我的 COM 对象的 AddRef
或 Release
方法被称为。
这是怎么回事?
最佳答案
等一下,我想我明白了。您正在制作一个 COM 对象,然后围绕该 COM 对象制作一个运行时可调用包装器,然后您向运行时可调用包装器询问它的 punk,然后您想知道为什么在那个 punk 上调用 release 不调用你的释放?这是否总结了您的问题?
如果是这样,您可能已经在问题中提到了所有这些细节,而不是让我们猜测。
那么,您认为为什么它会调用您的 版本?它将调用运行时可调用包装器的 Release 。包装器包装您的对象;这就是为什么它被称为包装器。每次添加和释放对象时,运行时可调用包装器不需要添加和释放对象!为什么会这样?它需要让您的对象保持事件状态并且它已经在您的对象上有一个引用;这足以使包裹的对象保持事件状态。为什么要做不必要的工作?
当您只有一个围绕 COM 对象的运行时可调用包装器时,您应该合理地期望该对象的引用计数在该对象的整个生命周期内保持不变。运行时获取一个 ref 一次,当 RCW 最后一次被垃圾回收或以某种其他方式释放时,它释放该 ref 并且对象删除自身。
这样想。假设你说:
foo->bar = blah;
blah->AddRef();
blah 得到 addref',因为 foo->bar 有一个对它的引用。现在你说:
abc->def = foo;
foo->AddRef();
这为 foo 添加了一个 ref。它是否为 blah 添加了一个引用?当然不是。为什么会这样? foo 有一个 blah 的引用; foo 被 abc 保持存活的事实与 blah 无关。
这里也是一样。你有:
wrapper = new RCW();
wrapper->wrapped = yourobject;
yourobject->AddRef();
这会为您的对象添加一个引用。现在如果你有
wrapper->QI(IUnknown, &punk)
这并没有让您对底层对象产生兴趣,而是对包装器产生了兴趣。如果你说
punk->AddRef();
它不对底层对象添加引用,它对包装器进行添加引用。
关于c# - 为什么 Marshal.Release 不对我的 COM 对象调用 Release?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4522808/
在编程环境中是哪一个?有区别吗?我已经看到了这两种方式,我不想在我的代码中拼错它。 最佳答案 编码(marshal)是工作图 block ;例如,消防编码(marshal)或美国编码(marshal)
我有以下结构: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct WAVEHDR { in
我找不到以下问题的明确答案:如果一个 COM 类是线程安全的,即它被标记为 Both 或 Free,我真的需要编码它的对象接口(interface)以将它传递给另一个线程吗?相同的过程?我不问两个线程
在编译 C# ASP.NET 应用程序时,我从 Visual Studio 2008 中收到奇怪的警告。谁能告诉我这个警告的含义(如果可能的话,用几个音节的词)? At least one of th
TL;DR:MongoDB 驱动程序是否提供了编码和解码文档单个字段的功能? 这是一个非常简单的问题,但这里有一些上下文: 我有一个工作人员负责在 2 个独立的数据库之间同步数据。当它接收到事件消息时
是否可以在使用自定义编码(marshal)拆收器的结构上使用 Marshal.SizeOf()? 例如: struct Abcde { public int test1; [MarshalAs
我有一张 map :[]map[string]string . 将结果填充到 json.marshal()兼容的对象。输出: [ { "key1": "val1", "key2":
如何在没有根元素的情况下进行编码(marshal)? type Ids struct { Id []string `xml:"id"` } IdsStr, _ := xml.Marshal(&Id
我有这个 C++ 代码: extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo) { *foo =
我创建了 map[string]interface{} 并且我想通过 2 个重置服务之间的映射传递多种类型。 每次我编码时,我都会在应该包含 reflect.Type 的字段中得到空映射。 Servi
我有一个托管的 .Net 类,它创建了我需要确保正确清理的非托管资源。 我有一个顺序结构: [StructLayout(LayoutKind.Sequential)] struct FooBar {
我在用 val akkaV = "2.2.3" val sprayV = "1.2.0" Seq( "io.spray" % "spray-can" % spra
我正在使用 Castor 编码/取消编码我的 Java 对象,其中一个对象包含一个 EnumMap。Castor 可以编码(marshal)/解封 EnumMaps 吗?我有一个带有一些嵌套 Hash
错误:com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException:无法编码类型类 [Ljava.lang.Strin
我们在 netbeans 中做了一次 cleanbuild,检查了 jdk 版本并在服务器上部署了所有内容,但仍然出现以下错误。有人可以帮忙吗? javax.servlet.ServletExcept
我想知道是否可以对我的类进行注释,以便编码器第一次遇到对象时,它会生成适当类型的 XML 元素,但任何其他对该对象的后续引用都将具有 XML IDREF条目已创建? 最佳答案 您可以利用 JAXB 的
我正在从现有代码构建一个通用类库,但我收到了一些编译器警告,提示我终其一生都不知道该如何处理。 我有这样的代码: void SomeMethod(Object data) { var size =
我在编码我的 JAXBElement 时遇到了这个异常,它有几个子元素。我如何弄清楚如何查明导致此异常的子元素? java.lang.NullPointerException at com.s
本文整理了Java中org.apache.poi.openxml4j.opc.internal.marshallers.ZipPartMarshaller.marshall()方法的一些代码示例,展示
我最近已经问了一个有关 JAXB 的问题,可以在以下位置找到:How to marshal/unmarshal Java objects with private fields using JAXB
我是一名优秀的程序员,十分优秀!