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