【发布时间】:2010-09-18 02:11:01
【问题描述】:
我最近遇到了一个错误,该错误仅在将库构建为发布版本而不是调试版本时才表现出来。该库是一个带有 COM 包装器的 .NET dll,我正在使用 CoCreateInstance 从非托管 c++ 应用程序中的 dll 创建一个类。当我最终追踪到这个错误时,它是由访问单例对象引起的。我有这样声明的单例实例:
private static readonly MyObjectType s_instance = new MyObjectType;
然后通过以下方式访问它:
public static MyObjectType Instance
{
get
{
return s_instance;
}
}
这失败了。将其更改为:
private static MyObjectType s_instance;
public static MyObjectType Instance
{
get
{
if (s_instance==null)
{
s_instance = new MyObjectType();
}
return s_instance;
}
}
解决了这个问题。任何想法为什么初始使用不起作用,以及这样做是否有任何缺点?
发布 dll 似乎完全可以从另一个托管应用程序中使用。
【问题讨论】:
-
这个错误是如何表现出来的?它崩溃了吗?有错误信息吗?
-
对 CoCreateInstance 的调用每次都返回“ClassNotRegistered”。但仅在发布版本中。在调试版本中一切正常。
-
是的,这就是我对更改它不满意的原因。该修复程序已升级为仅添加一个静态构造函数。这在 com 中仍然有效,这意味着我可以将实例保持为只读并且仍然是线程安全的。