我正在尝试使用OpcRcw.da.dll.如果我在测试控制台项目中互操作这个dll一切正常,但如果我构建dll项目来进行我的互操作体操并将我的库引入我的控制台项目中,我收到此错误:
无法使用已与其基础RCW分离的COM对象.
需要对类lib项目做些什么来不杀死RCW ref?
我有一个使用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.作者声称编译器创建单独的变量来保存将增加引用计数器的值.恕我直言,这是错误的,第一个例子证明了这一点.那是对的吗?
任何帮助都会很棒!
我在.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对象?