相关疑难解决方法(0)

无法使用已与其基础RCW分离的COM对象

我正在尝试使用OpcRcw.da.dll.如果我在测试控制台项目中互操作这个dll一切正常,但如果我构建dll项目来进行我的互操作体操并将我的库引入我的控制台项目中,我收到此错误:

无法使用已与其基础RCW分离的COM对象.

需要对类lib项目做些什么来不杀死RCW ref?

interop

48
推荐指数
2
解决办法
6万
查看次数

在C#中使用COM互操作时的RCW和引用计数

我有一个使用Office互操作程序集的应用程序.我知道运行时管理的"运行时可调用包装器(RCW)".但我不太确定引用计数如何增加.MSDN说,

RCW只保留对包装的COM对象的一个​​引用,而不管调用它的受管客户端的数量.

如果我理解正确,在以下示例中,

using Microsoft.Office.Interop.Word;

static void Foo(Application wrd)
{
    /* .... */
}

static void Main(string[] args)
{
    var wrd = new Application();
    Foo(wrd);
    /* .... */
}
Run Code Online (Sandbox Code Playgroud)

我将实例传递wrd给另一个方法.但这不会增加内部引用计数.所以我想知道引用计数增加的场景是什么?任何人都可以指出引用计数增加的情况吗?

另外我读了一些博客,说在使用COM对象编程时避免使用双点.像,wrd.ActiveDocument.ActiveWindow.作者声称编译器创建单独的变量来保存将增加引用计数器的值.恕我直言,这是错误的,第一个例子证明了这一点.那是对的吗?

任何帮助都会很棒!

c# com ms-office rcw office-pia

20
推荐指数
1
解决办法
1万
查看次数

与.NET 4.0无法使用"与其基础RCW分离的COM对象"

我在.NET 3.5 C#WinForms应用程序中有一个类,它有五种方法.每种方法都使用不同的C++ COM接口集.我用Marshal.FinalReleaseCOMObject清理这些COM对象.此代码在此.NET平台上运行正常,没有任何问题.但是,当我将此应用程序移动到.NET 4.0时,我开始在这些方法中的一个中从我ICOMInterface1向其转换变量的行中获取此错误ICOMInterface2,即:

ICOMInterface1  myVar= obj as ICOMInterface2; 
Run Code Online (Sandbox Code Playgroud)

无法使用已与其基础RCW分离的COM对象.

如果我删除使用的行Marshal.FinalReleaseCOMObject,我不会收到此错误.

我在这里错过了什么?如何从.NET 4.0平台上的内存中清除这些非托管COM对象?

c# com com-callable-wrapper

7
推荐指数
1
解决办法
2万
查看次数

标签 统计

c# ×2

com ×2

com-callable-wrapper ×1

interop ×1

ms-office ×1

office-pia ×1

rcw ×1