我最近遇到了一个错误,该错误仅在将库构建为发布版本而不是调试版本时才会显现出来。该库是一个带有 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 似乎可以从另一个托管应用程序中完美使用。
尝试添加一个(空)静态构造函数,或初始化单例in静态构造函数。
Jon Skeet 对单例模式进行了全面的讨论here https://csharpindepth.com/articles/Singleton。我不确定为什么失败,但猜测可能与beforefieldinit
旗帜。请参阅他的第四个示例,其中他添加了一个静态构造函数来调整此标志。我并不声称自己是这方面的专家beforefieldinit
,但这种症状似乎符合所讨论的一些症状here https://csharpindepth.com/articles/BeforeFieldInit.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)