2009-11-18 40 views
9

Tôi hiện đang có một thư viện lớp .NET được viết bằng C# cho thấy hàm chức năng của nó thông qua COM tới một chương trình C++ (trước-.NET).Tạo một máy chủ tự động hóa COM trong C#

Bây giờ chúng tôi muốn di chuyển thư viện ngoài quá trình để giải phóng không gian địa chỉ trong ứng dụng chính (ứng dụng xử lý hình ảnh và hình ảnh lớn chiếm không gian địa chỉ). Tôi nhớ từ những ngày VB6 của tôi rằng người ta có thể tạo ra một "máy chủ tự động hóa OLE". Hệ điều hành sẽ tự động khởi động và dừng máy chủ .exe khi các đối tượng được tạo/hủy. Điều này có vẻ như hoàn toàn phù hợp với chúng tôi: như xa như tôi có thể thấy không có gì sẽ thay đổi trong khách hàng ngoại trừ nó sẽ gọi CoCreateInstance với CLSCTX_LOCAL_SERVER thay vì CLSCTX_INPROC_SERVER.

Làm cách nào để tạo một máy chủ quá trình trong C#? Hoặc là không có thông tin trực tuyến về nó, hoặc thuật ngữ của tôi là tắt/lỗi thời!

+0

tôi đi đến kết luận tại một thời điểm rằng điều này đã không được hỗ trợ, nhưng tôi thiên đường' t thấy rằng tuyên bố rõ ràng bất cứ nơi nào. Tôi đã cố gắng interper để CoRegisterClassObject để đăng ký một nhà máy cho một đối tượng C# COM, nhưng tôi không bao giờ có nó để làm việc. Tò mò nếu có ai khác có may mắn! –

+0

Kiểm tra câu trả lời của tôi ở đây: http://stackoverflow.com/questions/24724784/com-interop-with-ipc-in-c-sharp/24732010#24732010 –

Trả lời

6

Bạn thực sự có thể làm điều này trong .NET (Tôi đã thực hiện nó trước đây như là một chứng minh khái niệm), nhưng đó là một chút công việc để có được tất cả mọi thứ hoạt động đúng (quá trình suốt đời, đăng ký, vv).

Tạo ứng dụng Windows mới. Trong phương thức Main, hãy gọi RegistrationServices.RegisterTypeForComClients- đây là một wrapper được quản lý xung quanh CoRegisterClassObject để quản lý nhà máy lớp cho bạn. Chuyển cho nó kiểu của lớp ComVisible được quản lý (loại bạn thực sự muốn tạo. .NET cung cấp cho nhà máy lớp một cách tự động) cùng với RegistrationClassContext.LocalServer và RegistrationConnectionType.SingleUse. Bây giờ bạn có một exe rất cơ bản có thể được đăng ký như là một LocalServer32 cho kích hoạt COM. Bạn vẫn sẽ phải tính toán thời gian tồn tại của quá trình (thực hiện refcounts trên các đối tượng được quản lý với các constructors/finalizers- khi bạn nhấn 0, gọi UnregisterTypeForComClients và thoát) - bạn không thể để Main thoát cho đến khi tất cả các đối tượng của bạn đã chết.

Đăng ký không quá tệ: tạo phương thức phân bổ ComRegisterFunction cho biết thêm khóa LocalServer32 trong HKLM \ CLSID (yourclsidhere), có giá trị mặc định là đường dẫn đến exe của bạn. Chạy regasm yourexe.exe/codebase/tlb, và bạn tốt để đi.

+0

Cảm ơn bạn: hóa ra quản lý lâu dài không phải là vấn đề : chúng tôi chỉ khởi động máy chủ quá trình khi ứng dụng chính khởi động và tắt nó khi nó kết thúc. Vì vậy, mẹo duy nhất là gọi RegistrationServices.RegisterTypeForComClients - dễ dàng! – Grokys

2

Bạn luôn có thể hiển thị lớp .NET của mình dưới dạng lớp COM bằng cách sử dụng InteropServices và sau đó định cấu hình thư viện làm ứng dụng COM +. Thư viện .NET sẽ chạy quá trình và được lưu trữ bởi một cá thể DLLHOST.EXE.

1

Dưới đây là một bài viết trong MSDN mà bao gồm tất cả các khía cạnh của cách tạo COM LocalServer trong C# (.net): link

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