我最近遇到了一个错误,只有在将库构建为发布版本而不是调试版本时才会显示出来.该库是一个带有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似乎可以从另一个托管应用程序中完全使用.
尝试添加(空)静态构造函数,或在静态构造函数中初始化单例.
Jon Skeet 在这里对单身模式进行了全面讨论.我不确定它为什么失败,但猜测它可能与"beforefieldinit"标志有关.看看他的第四个例子,他在那里添加了一个静态构造函数来调整这个标志.我并不声称自己是beforefieldinit的专家,但这种症状似乎符合这里讨论的一些症状.