2011-10-18 38 views
10

Bối cảnh:Đăng ký một NET COM DLL trong Wix Install

ứng dụng của chúng tôi là một plugin cho một ứng dụng lớn hơn nhiều. Mọi thứ chúng ta tạo ra là các tệp DLL mà ứng dụng lớn hơn móc vào. Bởi vì điều này .NET (C#) của chúng tôi, các tập tin DLL phải được đăng ký cho một giao diện COM.

Chúng tôi có dự án InstallShield đang hoạt động, nhưng vì nhiều lý do tôi không truy cập vào đây, chúng tôi muốn di chuyển nó sang WiX. Điều duy nhất còn lại được thực hiện cho trình cài đặt là đăng ký các tệp DLL của chúng tôi cho COM.

vấn đề

Dưới đây là một thành phần mẫu với một tập tin DLL duy nhất.

<Component Id="MyComponent" Guid="COMPONENT-GUID" SharedDllRefCount="yes" > 
    <File Id="MyDLL.dll" Name="MyDLL.dll" KeyPath="yes" Assembly=".net" 
      AssemblyManifest="MyDLL.dll" AssemblyApplication="MyDLL.dll" /> 
</Component> 

Theo câu trả lời chấp nhận của How do you register a Win32 COM DLL file in WiX 3?, nó được khuyến khích để thêm SelfRegCost=1 cho thẻ File. Điều này dẫn đến lỗi khi cài đặt:

Mô-đun C: \ Program files \ Product \ MyDll.dll không đăng ký được. HRESULT -2147024769. Liên hệ với nhân viên hỗ trợ của bạn.

Câu trả lời thứ hai trong cùng một câu hỏi (bởi Rob Menshing) khuyến cáo chống lại phương pháp này, nhưng để thêm bên trong thẻ tập tin này:

<Class Id="PUT-CLSID-HERE" Context="InprocServer32" ThreadingModel="apartment" Description="Your server description"> 
     <ProgId Id="Your.Server.1" Description="Your ProgId description"> 
      <ProgId Id="Your.Server" Description="Your ProgId description" /> 
     </ProgId> 
    </Class> 

    <Class Id="PUT-PROXY-CLSID-HERE" Context="InprocServer32" ThreadingModel="both" Description="Your server Proxies, assuming you have them"> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface1" /> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface2" /> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface3" /> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface4" /> 
    </Class> 

Tôi là một chút bối rối như để đưa vào như ID CLSID. Tôi đặt trong một GUID tạo ra và cài đặt nó. Nó được cài đặt tốt, nhưng các ứng dụng lớn hơn không thể tìm thấy các tập tin DLL. (Tôi đã sử dụng các thẻ giao diện được tạo ra từ heat.exe.)

Một cách tiếp cận tìm thấy trong cùng một câu hỏi (bằng Adan Tegen) khuyến cáo sử dụng tập tin heat.exe myDll.dll out my.wxs

Sử dụng đầu ra, Tôi thêm thẻ này vào thẻ Tệp:

<TypeLib Id="Another Guid" Language="0" MagorVersion="1"> 
    <!--Interfaces generated from heat.exe--> 
</TypeLib> 

Mọi cách tôi đã cố gắng đăng ký .NET cho COM không thành công và sau khi đọc rất nhiều câu hỏi về chủ đề này, tôi không biết cách làm đúng cách. Tôi nên làm gì? Tại sao lại là một nhiệm vụ khó khăn như vậy khi mọi thứ khác trong WiX khá đơn giản?

Tôi nên đề cập rằng dự án InstallShield ban đầu đã tạo một hành động tùy chỉnh gọi là regasm.exe. Nếu mọi thứ khác thất bại có thể là một khả năng, nhưng tôi thà làm những việc đúng đắn hơn.

Tôi chỉ thấy rằng heat.exe file myDll.dll -scom -o myDll.wxs xuất ra giá trị đăng ký tương tự như những gì tôi cần. Bây giờ, làm cách nào để tôi tham khảo thành phần mới được tạo bên trong thành phần DLL?

Trả lời

9

Tôi chỉ thấy rằng heat.exe file myDll.dll -scom -o myDll.wxs xuất ra giá trị đăng ký tương tự như những gì tôi cần.

Bạn có chắc chắn về -scom ở đó không? AFAIK, tùy chọn đó thực sự ngăn chặn đăng ký COM!

Bây giờ, làm thế nào để tôi tham khảo thành phần mới được tạo bên trong thành phần DLL?

Thành phần được tạo bởi heat.exe đã bao gồm phần tử File cho DLL. Vì vậy, nó thực sự chứa tất cả mọi thứ cần thiết để cài đặt và đăng ký các tập tin DLL. Bạn không cần bản gốc "thành phần DLL".

Nếu bạn cần đặt tệp và đăng ký COM trong các thành phần riêng biệt, thì bạn sẽ phải xóa phần tử File khỏi thành phần được tạo bởi heat.exe.

Ngoài ra, các thành phần không thể tham chiếu các thành phần khác. Bạn có thể có tài liệu tham khảo giữa ComponentGroup s mặc dù, một cái gì đó mà chúng tôi sử dụng rất nhiều trong wixlibs của chúng tôi để model dependencies, nhưng đó là một trường hợp sử dụng khá tiên tiến.

+0

Vì vậy, trong số Tôi chỉ cần thêm ? Lệnh heat.exe của tôi nên là gì? Các -scom là từ một gợi ý tôi tìm thấy trong khi googling. Tôi nghĩ rằng COM đàn áp là lạ, nhưng nó đã cho tôi những CSLID mà tôi mong đợi. file heat.exe myDll.dll -o mydll.wxs? – SaulBack

+0

Tôi đã sử dụng đầu ra từ "tệp heat.exe myDll.dll -o mydll.wxs". Cảm ơn – SaulBack

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