2008-12-12 29 views
32

Tôi đã tìm thấy ví dụ về đăng ký các tệp DLL, Registering an Assembly for COM Interop in a MSI file with the Windows Installer XML toolset. và WiX phàn nàn về thuộc tính "AssemblyRegisterComInterop".Làm cách nào để bạn đăng ký tệp DLL Win32 COM trong WiX 3?

Tôi đã xóa và thay đổi thuộc tính "Assembly" thành win32 và nó nói rằng tôi cần chỉ định thuộc tính AssemblyManifest, nhưng tôi nên đặt gì ở đó?

Trả lời

39

Cách dễ nhất (và Rob M sẽ rant và rave về cách này là sai) chỉ sử dụng SelfRegCost=1 trên thẻ tệp cho DLL.

Điều này là sai, bởi vì chúng ta nên kiểm soát rõ ràng việc đăng ký DLL, không cho phép nó chỉ chạy mã tùy ý qua DllRegisterServer. Lý thuyết là một DLL không nên làm gì ngoài việc đặt các mục thích hợp trong registry khi DllRegisterServer được gọi. Thật không may, nhiều người trong số họ làm nhiều hơn thế, vì vậy tự đăng ký có thể là cách duy nhất để cài đặt của bạn hoạt động.

Điều này cũng sai, vì điều đó có nghĩa là hệ thống cài đặt Windows không biết gì về các khóa đăng ký đó, và những gì nên và không nên ở đó. Điều đó có nghĩa là việc sửa chữa sẽ không hoạt động và có thể việc cài đặt sẽ không hoạt động đúng cách, v.v.

Nếu không, bạn có thể tạo mã WiX thích hợp bằng cách trỏ heat.exe tại DLL của bạn và tích hợp đầu ra vào WiX hiện tại của bạn dự án. Bạn sẽ nhận được nhiều loại thẻ Class, ProgID, TypeLib và Registry. Bạn có thể cần chỉnh sửa thủ công kết quả đó để biên dịch.

Tôi hy vọng điều đó sẽ hữu ích.

+0

Vì vậy, về cơ bản sao chép/dán đầu ra từ heat.exe và thay đổi đường dẫn thích hợp vv? – Davy8

+0

Tôi thích đặt các wx mà nhiệt được tạo thành một đoạn mà các tham chiếu chính của wx. Các tùy chọn bạn đã truyền cho nhiệt là gì, điều đó đã không đăng ký dll. – CheGueVerra

+0

Tôi thường phải di chuyển các thẻ lớp và progid vào thẻ tập tin, và có thể chỉnh sửa một số khóa registry. Cụ thể, nếu DLL là một DLL .NET, bạn sẽ cần phải cung cấp các id duy nhất cho các khóa registry tham chiếu đến mscoree.dll hoặc bạn sẽ nhận được xung đột với các tệp được tạo tự động. –

23

Nó không chỉ là tôi sẽ rant và rave về cách SelfReg là ác. MSI SDK cung cấp cho bạn a list of seven reasons why not to use SelfReg.

Ví dụ:

<Component Id="Component" Guid="*"> 
    <File Source="ComServer.dll"> 
     <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> 
    </File> 
</Component> 

Cuối cùng, câu trả lời của Troy là all correct.

+1

[** Tự đăng ký được coi là có hại **] (http://stackoverflow.com/questions/6129816/msi-register-dll-self-registration-considered-harmful/6141538#6141538) (tha thứ cho Dijkstra-allusion) . –

13

Bạn có thể thử sử dụng chương trình heat.exe và sau đó tham khảo đoạn trong mã wix của bạn.

heat.exe file <filename> -out <output wxs file> 

Như trong:

heat.exe file my.dll -out my.wxs 
+0

-1 không có ví dụ về cách tham khảo một đoạn trong wix. –

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