2008-10-20 33 views
6

Gần đây tôi đã có một lỗi mà chỉ biểu hiện chính nó khi thư viện được xây dựng dưới dạng bản dựng phát hành chứ không phải là bản dựng gỡ lỗi. Thư viện là một dll .NET với một trình bao bọc COM và tôi đang sử dụng CoCreateInstance để tạo một lớp từ dll trong một ứng dụng C++ không được quản lý. Khi tôi cuối cùng đã theo dõi lỗi xuống nó được gây ra bằng cách truy cập một đối tượng singleton. Tôi đã dụ singleton tuyên bố như vậy:Sự khác biệt trong những cách tạo ví dụ tĩnh cho một singleton là gì?

private static readonly MyObjectType s_instance = new MyObjectType; 

và sau đó truy cập nó với:

public static MyObjectType Instance 
    { 
     get 
     {        
      return s_instance; 
     } 
    } 

này đã thất bại. Thay đổi nó thành:

private static MyObjectType s_instance; 

public static MyObjectType Instance 
    { 
     get 
     {    
      if (s_instance==null) 
      { 
       s_instance = new MyObjectType(); 
      } 
      return s_instance; 
     } 
    } 

khắc phục sự cố. Bất kỳ ý tưởng tại sao việc sử dụng ban đầu không hoạt động và nếu có bất kỳ nhược điểm nào để thực hiện nó theo cách nào?

Dll phát hành dường như hoàn toàn có thể sử dụng được từ một ứng dụng được quản lý khác.

+0

Lỗi này tự hiển thị như thế nào? Nó đã sụp đổ? Có thông báo lỗi không? –

+0

Cuộc gọi đến CoCreateInstance vừa trả lại 'ClassNotRegistered' mỗi lần. Nhưng chỉ trong một xây dựng relaese. trong một debug xây dựng mọi thứ hoạt động tốt. –

+0

Khắc phục của bạn không phải là chủ đề an toàn. – Joe

Trả lời

8

Thử thêm một hàm tạo tĩnh (trống) hoặc khởi tạo singleton trong một hàm tạo tĩnh.

Jon Skeet có cuộc thảo luận đầy đủ về các mẫu đơn lẻ here. Tôi không chắc tại sao nó thất bại, nhưng tại một đoán nó có thể liên quan đến lá cờ "beforefieldinit". Xem ví dụ thứ 4 của mình, nơi anh ta thêm một hàm tạo tĩnh để tinh chỉnh cờ này. Tôi không tuyên bố là một chuyên gia về beforefieldinit, nhưng triệu chứng này dường như phù hợp với một số triệu chứng được thảo luận here.

+0

Tôi thậm chí không biết có một thứ như các nhà xây dựng tĩnh. Cảm ơn (không biết) giáo dục tôi! – Rik

+0

Bingo. Thêm một constructor tĩnh rỗng cố định vấn đề. Cảm ơn. 2 ngày của cuộc đời tôi, tôi sẽ không bao giờ trở lại. –

0

Chỉ cần nhắc lại những gì Marc Gravell đã nói, nhưng có vẻ như rất nhiều giống như một vấn đề trước đó, có nghĩa là hàm tạo tĩnh rỗng là giải pháp của bạn. Bạn sẽ cần phải đăng bất kỳ và tất cả các nhà xây dựng trong lớp để có được một câu trả lời dứt khoát.

Phương pháp thứ hai có lợi thế là tải chậm (nơi đó là lợi thế).

+0

thực sự, như tôi đã nói ở trên thêm một constructor tĩnh là giải pháp. –

Các vấn đề liên quan