6

我最近遇到了一个错误,该错误仅在将库构建为发布版本而不是调试版本时才表现出来。该库是一个带有 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 似乎完全可以从另一个托管应用程序中使用。

4

2 回答 2

9

尝试添加(空)静态构造函数,或静态构造函数中初始化单例。

Jon Skeet在这里对单例模式进行了完整的讨论。我不确定它为什么失败,但猜测它可能与“beforefieldinit”标志有关。请参阅他的第 4 个示例,其中他添加了一个静态构造函数来调整此标志。我并不声称自己是 beforefieldinit 方面的专家,但这种症状似乎符合此处讨论的某些症状。

于 2008-10-20T10:26:47.963 回答
0

只是重申 Marc Gravell 所说的话,但这听起来很像beforefieldinit 问题,这意味着空的静态构造函数是您的解决方案。您需要在类中发布任何和所有构造函数以获得明确的答案。

第二种方法具有延迟加载的优势(这是一个优势)。

于 2008-10-20T10:56:19.107 回答