2010-07-09 42 views
11

Tôi đã tạo một bổ trợ Office trong VS 2008, C#, .NET 3.5 và VSTO. Nó được triển khai thông qua ClickOnce. Một hình thức cấu hình thời gian chạy thực hiện regsvr32 để đăng ký "fooapi.dll" đi kèm với dự án mà không thể được đăng ký trong thời gian instal do giới hạn ClickOnce. Có cách nào ưa thích hơn để kiểm tra xem "fooapi.dll" có được đăng ký trong thời gian chạy trong C# không?Làm cách nào để kiểm tra xem một dll COM được đăng ký trong C#

+2

Erm, hy vọng của bạn về việc có thể đăng ký máy chủ COM đó là mỏng. Nó yêu cầu đặc quyền quản trị viên. Sử dụng COM miễn phí. –

Trả lời

4

Thử phương pháp Type.GetTypeFromCLSID hoặc Type.GetTypeFromProgID để nhanh chóng kiểm tra sự tồn tại của giao diện COM.

Hoặc, chỉ cần khởi tạo đối tượng và bẫy ngoại lệ, ví dụ:

catch(COMException ex) { 
    if(ex.ErrorCode == -2147221164) { 
     // Retrieving the COM class factory for component with CLSID XXXX failed 
    } 
} 

UPDATE:

This overload dường như là người duy nhất mà thực sự trả null nếu đối tượng COM không thể được khởi tạo.

+2

Vẻ đẹp với 'Type.GetTypeFromCLSID' là nó luôn trả về System .__ ComObject cho dù CLSID có hợp lệ hay không – rpattabi

1

Tôi nghĩ cách đơn giản nhất là thử và tạo thành phần nằm trong fooapi.dll. Gói mã tạo trong khối try/catch và bắt ngoại lệ được tạo ra nếu DLL không được đăng ký đúng cách. Đây là cách chắc chắn nhất để kiểm tra đăng ký chính xác

2

Nếu bạn biết DLL GUID, bạn có thể kiểm tra sự tồn tại của khóa đăng ký trong HKCU\SOFTWARE\Classes.

2

Kiểm tra sự hiện diện của HKEY_CLASSES_ROOT\CLSID\{your_CLSID} và các giá trị thích hợp bên dưới. Có thể bạn chỉ có thể tìm kiếm các giá trị InprocServer32Codebase nhưng bạn cũng có thể chọn tham gia để kiểm tra kỹ hơn.

Bạn cũng có thể chỉ cần tạo một phiên bản của thành phần. Tuy nhiên, nếu cả hai thành phần và khách hàng là C# và bạn sử dụng new, CLR có thể tìm ra lắp ráp thích hợp và tải nó bằng cách thực hiện COM. (Có, nó có thể thông minh như thế đôi khi :-)). Bạn nên rõ ràng p/gọi đến CoCreateInstance

2

Nếu bạn có ProgID của các thành phần trong DLL, bạn có thể thử nhận Type:

System.Type.GetTypeFromProgID(string progID, bool throwOnError) 

Nếu bạn nhận được System.Runtime.InteropServices.COMException, nó có nghĩa là ProgID không được đăng ký.

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