2011-07-17 15 views
6

Khốn khổ, khốn khổ và ba lần. Tại sao Wix thực hiện cài đặt .NET assembly SOOOOOO khó!Wix! (Bind.AssemblyFullName.fileId) chỉ hoạt động trên các assembly GACed?

Tôi đang cài đặt Máy chủ COM Inprocess được triển khai trong .NET, trong bản cài đặt Wix của tôi, tôi cần tạo các mục đăng ký cho nó. Tôi không muốn làm điều này, tôi muốn Wix có một tương đương với RegAsm, nhưng họ làm cho tôi làm điều này bằng tay. Tôi cảm thấy mệt mỏi vì bị bực tức vì đã gợi ý đây là một đám mây phức tạp, vì vậy tôi đã từ bỏ và cố gắng làm theo cách khai báo, giống như một cậu bé ngoan. Vì vậy, đây là những gì công cụ đăng ký của tôi trông giống như bây giờ:

<File Id="filDriverAssembly" Source="$(var.TiGra.Astronomy.AWRDriveSystem.TargetPath)" KeyPath="yes" Vital="yes" Assembly=".net"> 
    <!--<Class Context="InprocServer32" Description="$(var.InstallName)" Id ="$(var.DriverGuid)" ThreadingModel ="both" > 
    <ProgId Description="$(var.InstallName)" Id ="$(var.DriverId)" /> 
    </Class>--> 
</File> 
<RegistryKey Root="HKCR" Key="$(var.DriverId)" Action="createAndRemoveOnUninstall"> 
    <RegistryValue Type="string" Value="$(var.DriverTypeName)"/> 
    <RegistryKey Key="CLSID"> 
    <RegistryValue Type="string" Value="$(var.DriverGuid)" /> 
    <RegistryKey Key="$(var.DriverGuid)"> 
     <RegistryValue Type="string" Value="$(var.DriverTypeName)"/> 
     <RegistryKey Key="InprocServer32"> 
     <RegistryValue Type="string" Value="mscoree.dll" /> 
     <RegistryValue Type="string" Name="ThreadingModel" Value="Both"/> 
     <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/> 
     <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/> 
     <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/> 
     <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" /> 
     <RegistryKey Key="!(bind.fileVersion.filDriverAssembly)" > 
      <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/> 
      <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/> 
      <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/> 
      <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" /> 
     </RegistryKey> 
     </RegistryKey> 
     <RegistryKey Key="ProgId"> 
     <RegistryValue Type="string" Value="$(var.DriverId)" /> 
     </RegistryKey> 
     <RegistryKey Key="Implemented Categories"> 
     <RegistryKey Key="{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" /> 
     </RegistryKey> 
    </RegistryKey> 
    </RegistryKey> 
</RegistryKey> 
<!-- Wow6432Node for x86 compatibility, installed only on x64 systems --> 
<!-- HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node --> 
<?if $(var.Win64) = "yes" ?> 
<RegistryKey Root="HKCR" Key="Wow6432Node" Action="createAndRemoveOnUninstall"> 
    <RegistryKey Key="CLSID"> 
    <RegistryValue Type="string" Value="$(var.DriverGuid)" /> 
    <RegistryKey Key="$(var.DriverGuid)"> 
     <RegistryValue Type="string" Value="$(var.DriverTypeName)"/> 
     <RegistryKey Key="InprocServer32"> 
     <RegistryValue Type="string" Value="mscoree.dll" /> 
     <RegistryValue Type="string" Name="ThreadingModel" Value="Both"/> 
     <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/> 
     <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/> 
     <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/> 
     <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" /> 
     <RegistryKey Key="!(bind.assemblyVersion.filDriverAssembly)" > 
      <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/> 
      <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/> 
      <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/> 
      <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" /> 
     </RegistryKey> 
     </RegistryKey> 
     <RegistryKey Key="ProgId"> 
     <RegistryValue Type="string" Value="$(var.DriverId)" /> 
     </RegistryKey> 
     <RegistryKey Key="Implemented Categories"> 
     <RegistryKey Key="{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" /> 
     </RegistryKey> 
    </RegistryKey> 
    </RegistryKey> 
</RegistryKey> 
<?endif ?> 

RegAsm là dành cho wimps, eh? Dù sao, thông báo rằng tôi cần phải có được tên đầy đủ lắp ráp để tạo ra một số các khóa registry. Tôi đang sử dụng các biến liên kết, cụ thể là Value="!(bind.AssemblyFullName.filDriverAssembly)".

Tuy nhiên, điều này không hoạt động trừ khi tôi thêm thuộc tính Assembly=".net" vào mục nhập tệp. Nếu tôi không thêm thuộc tính đó, hoặc nếu tôi sử dụng Assembly="no", sau đó tôi nhận được

Lỗi 2 Chưa giải quyết ràng buộc thời gian biến ! (Bind.AssemblyFullName.filDriverAssembly).

Khi tôi thêm Assembly=".net" đến mục tập tin, sau đó các biến binder chỉ làm việc tốt, nhưng Wix đặt lắp ráp của tôi vào Global Assembly Cache, đó là KHÔNG những gì tôi muốn! Trời ơi.

Không thể truy vấn tên đầy đủ của một hội đồng trong dự án Wix nếu nó không đi vào GAC? Tại sao hai điều này phụ thuộc lẫn nhau?

Trả lời

6

Trừ khi tệp được đánh dấu là hội đồng, nó giống như bất kỳ tệp nào khác; WiX không có ý tưởng nó có thể có thuộc tính lắp ráp. Kiểm tra thuộc tính AssemblyApplication: Bạn có thể đặt nó vào một tệp thích hợp và đặt @Assembly = ". Net" mà không nói cho MSI tệp đi vào GAC.

+0

Tôi không chắc cách thức hoạt động của tài liệu này, bạn có thể cung cấp ví dụ không? Thuộc tính đó dường như chỉ hợp lệ trên khóa NativeAssembly, nó sẽ buộc NGEN tạo ra các assembly gốc. Tôi không muốn NGEN hội đồng; đó là cùng một vấn đề, mọi thứ đều có hai ý nghĩa. Tôi chỉ muốn lấy siêu dữ liệu từ một assembly để sử dụng trong một phần khác của tiến trình cài đặt. –

+0

Ngoài ra, lắp ráp của tôi là một mục đích chung sẽ được nạp bởi nhiều ứng dụng, một số trong đó chưa tồn tại. Làm thế nào để tôi chỉ định "ứng dụng sẽ tải assembly này"? –

+0

Tôi đang nói về thuộc tính File/@ AssemblyApplication. –

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