我最近遇到过一个错误,只有在将库构建为发布版本而不是调试版本时才会显示出来。该库是一个带有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的专家,但这种症状似乎符合所讨论的一些症状此处

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top