2010-01-19 23 views
7

Khi xác định một lớp COM có thể nhìn thấy trong C++ Tôi có thể xác định mô hình được hỗ trợ luồng trong file header (đường threading(single)):Làm thế nào để đánh dấu đối tượng .NET tiếp xúc với COM-interop dưới dạng đơn luồng?

[ 
    coclass, 
    default(IComInterface), 
    threading(single), 
    vi_progid("Example.ComClass"), 
    progid("Example.ComClass.1"), 
    version(1.0), 
    uuid("72861DF5-4C77-43ec-A4DC-ED04396F0CCD") 
] 

Có cách nào có thể so sánh các thiết lập các mô hình luồng trong .NET (đối với ví dụ một thuộc tính)? Tôi hiện xác định COM-lớp học của tôi như vậy:

[Guid("67155A91-2948-43f5-B07F-5C55CDD240E5")] 
[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IComInterface 
{ 
    ... 
} 


[Guid("DC5E6955-BB29-44c8-9FC0-6AADEEB2AFFB")] 
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Example.ComClass")] 
public class ComClass : IComInterface 
{ 
    ... 
} 

--edit:

Các ý kiến ​​về câu trả lời rõ rệt là những điều thực sự quan trọng. Nó có vẻ như cách duy nhất để nói với RegAsm để thiết lập một ThreadingModel khác nhau là viết một phương thức đăng ký tùy chỉnh được đánh dấu bằng thuộc tính [ComRegisterFunction].

Trả lời

6

Điều đó thực sự mơ hồ, tôi chưa bao giờ thấy thuộc tính "luồng" trong MIDL. Cũng không có MSDN Library authors.

Một COM coclass xuất bản yêu cầu luồng của nó trong sổ đăng ký, sử dụng phím HKCR\CLSID\{guid}\InProcServer32. Giá trị ThreadingModel tuyên bố căn hộ cần thiết. Nếu nó bị thiếu hoặc được đặt thành "Căn hộ" thì sẽ thông báo rằng không an toàn chỉ và yêu cầu trợ giúp từ chuỗi STA. CoCreateInstance() sử dụng giá trị này khi nó tạo đối tượng. Nếu cần thiết, nó sẽ bắt đầu một chuỗi STA và tạo proxy nếu luồng hiện tại không phải là STA, đảm bảo nó luôn được sử dụng theo cách an toàn.

Một lớp học [ComVisible] .NET sẽ được đăng ký là "Cả hai", cho biết rằng có thể sử dụng nó trên một chuỗi trong MTA. Khá lạc quan, nhưng theo triết lý .NET rằng mọi thứ đều không an toàn nhưng có thể an toàn bằng cách đặt từ khóa lock vào đúng vị trí. Một lời hứa không thường được kiểm tra btw, nguy hiểm. Việc ghi đè giá trị ThreadingModel (hoặc bỏ qua nó) yêu cầu phải viết mã để tự đăng ký coclass, được trang trí với thuộc tính [ComRegisterFunction]. RegistrationServices.RegisterTypeForComClients() có thể hữu ích để có được các phím cơ bản vào vị trí.

+2

Tôi nghĩ OP không nói về các thuộc tính MIDL. http://msdn.microsoft.com/de-de/library/zfbxt3zs.aspx – Henrik

+0

Bạn nói đúng. Nó không thay đổi câu trả lời của tôi. –

+0

Tôi chỉ cần kiểm tra sổ đăng ký và giá trị hiện tại cho ThreadingModel là "Cả hai", mà không phải là một trong những tôi đang tìm kiếm. Không có cách nào khác để thiết lập ThreadingModel ngoài việc đăng ký thủ công các lớp COM bằng cách sử dụng một phương thức được đánh dấu bằng [ComRegisterFunction]? – Xperimental

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