Как в WXS ссылаться на файл, установленный через другой компонент? - PullRequest
5 голосов
/ 28 июля 2011

Этот вопрос относится к выводу файла heat.exe.Я пытаюсь сделать "правильную вещь" в отношении регистрации некоторых сборок .NET для взаимодействия COM в MSI.Regasm.exe - это неправильная вещь .

Прямой вызов regasm.exe, который прост и работает "в основном", по-видимому, не очень хорошая идея, говорит Роб Мэншинг .Это сообщение в блоге объясняет ПОЧЕМУ это не очень хорошая идея, а также предлагает очень простое решение.К сожалению, пост 2004 года предлагает функцию wix, которая сейчас устарела или не поддерживается.Я полагаю, что описанное здесь решение более не является действительным, но проблема, изложенная в этом сообщении, остается.

Видимо, «правильное» решение проблемы - запустить heat.exe, а затем «исправить» ссылки на каталоги и так далее.Это звучит достаточно просто, и это то, что я пытаюсь сделать.

хорошо, поэтому я пытаюсь поступить правильно.Также я не хочу GAC сборки, что означает, что я должен сделать регистрацию COM с аргументом codebase.Вывод файла heat.exe включает в себя что-то вроде этого:

    <RegistryKey Root="HKCR" Key="CLSID\{xxx-GUID-HERE-xxx-xxx}\InprocServer32\1.2.3.4" >
      <RegistryValue Name="Class" Value="My.DotNet.Classname.Here" Type="string" />
      <RegistryValue Name="Assembly" Value="Strongname of .NET Assembly here" />
      <RegistryValue Name="RuntimeVersion" Value="v2.0.50727" Type="string" />
      <RegistryValue Name="CodeBase" Value="file:///[#fil4B562083D141F5A2F29E28A1BD09AF3E]" Type="string" />
    </RegistryKey>

Первый вопрос: что такое Value="file:///[#fil4B562083D141F5A2F29E28A1BD09AF3E]"?

Мне кажется, что fil4B562083D141F5A2F29E28A1BD09AF3E - это идентификатор, который генерируется Wix;Идентификатор принадлежит элементу File в файле .wxs, который относится к пути к сборке (DLL), которая содержит названный класс .NET.Теперь, для чего именно существует этот октопор?И квадратные скобки?а префикс file:///?Помогите мне понять этот синтаксис.

Причина, по которой я спрашиваю - я не хочу использовать этот идентификатор.У меня уже есть идентификатор файла, который отражает фактическое значение файла, и это не так.

Но указанный файл установлен в другом компоненте.Когда я пытаюсь сослаться на этот файл, я получаю сообщение об ошибке такого типа:

  C:\dev\project\ComRegistration.wxs(397): warning LGHT1076: ICE69: Mismatched component reference. 
  Entry 'reg9652ABFDD2B970C523070996FE7BB510' of the Registry table belongs to 
  component 'C.ComRegistration'. However, the formatted string in column 'Value' references 
  file 'MyAssembly.dll' which belongs to component 'C.Main'. Components are in the same 
  feature. [C:\dev\project\MyProject.wixproj]

Как мне решить эту проблему?

Мне кажется, я не хочу, чтобы в этом компоненте был еще один элемент File, ссылающийся на тот же файл файловой системы.Он уже установлен с другим компонентом (та же функция).Как я могу сослаться на это?

В основном я хочу такой элемент, как FileRef, но этого, по-видимому, не существует.

1 Ответ

5 голосов
/ 29 июля 2011

[# fileId] заменяется путем к файлу. (Полный список см. В «Отформатировано» в MSI SDK .)

Вы можете избежать ICE69, поместив значения реестра и файл в один и тот же компонент. ICE69 сообщает вам, что существует возможность установки файла без его регистрации. (Гипотетический FileRef не решил бы эту проблему.) Сложите их вместе, проблема не может возникнуть, и ICE69 не будет жаловаться.

...