我正在尝试使用OpcRcw.da.dll.如果我在测试控制台项目中互操作这个dll一切正常,但如果我构建dll项目来进行我的互操作体操并将我的库引入我的控制台项目中,我收到此错误:
无法使用已与其基础RCW分离的COM对象.
需要对类lib项目做些什么来不杀死RCW ref?
Ste*_*don 78
出现这种情况有几个原因,我知道的最重要的原因如下.
没有强烈引用代表的事件处理程序
调用者在com对象上订阅一个事件,而不保留对回调委托的强引用.下面是一个如何正确执行此操作以及如何不执行此操作的示例:原因是需要将强引用保留给委托,如果超出范围,则包装器将释放接口的引用计数坏事会发生.
public class SomeClass
{
private Interop.ComObjectWrapper comObject;
private event ComEventHandler comEventHandler;
public SomeClass()
{
comObject = new Interop.ComObjectWrapper();
// NO - BAD!
comObject.SomeEvent += new ComEventHandler(EventCallback);
// YES - GOOD!
comEventHandler = new ComEventHandler(EventCallback);
comObject.SomeEvent += comEventHandler
}
public void EventCallback()
{
// DO WORK
}
}
Run Code Online (Sandbox Code Playgroud)
调用已处置的运行时可调用包装器
包装材料已经处理完毕,并在处理好后再进行调用.一种常见的方法是,如果控件使用的是activex控件或COM对象,并且控件Dispose()被无序调用.
调试步骤
调试此问题的好方法是执行以下操作:
另一件事
这与此问题无关,但在我们讨论该主题时,除非您另有说明,否则请务必检查您的COM对象使用的线程是否标记为STA.您可以通过打破调试器并检查从以下位置返回的值来执行此操作:
Thread.CurrentThread.GetApartmentState();
Run Code Online (Sandbox Code Playgroud)
AJ.*_*AJ. 37
有点难以分辨你的实际应用程序在做什么,但听起来你可能正在实例化COM对象,然后尝试从另一个线程访问它,可能是在Timer.Elapsed事件中.如果您的应用程序是多线程的,则需要在将要使用它的每个线程中实例化COM对象.
| 归档时间: |
|
| 查看次数: |
63347 次 |
| 最近记录: |