2016-01-01 3 views
0

Я пытаюсь развернуть мои новые видимые интерфейсы .net Com. После установки мой новый .dll может быть загружен моим приложением. Существует требование сделать один из интерфейсов, который не работает.Развертывание и регистрация интерфейсов Inter Interop

Я собираю мой wix xml с использованием Heat.

"C:\Program Files (x86)\WiX Toolset v3.10\bin\heat.exe" file "MYComConnect.dll" /out "dll_fragment_12_2015.wxs" 

"C:\Program Files (x86)\WiX Toolset v3.10\bin\heat.exe" file "MYComConnect.tlb" -scom /out "tlb_fragment_12_2015.wxs" 

Чтобы знать, что это не проблема кодирования с моей .dll Я зарегистрировал .dll и .TLB с Regasm и все работает отлично.

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "MYComConnect.dll" /tlb 

Затем я сделал реестр сравнения того, что добавлено regasm и что добавляет мой установщик wix.

Я заметил, что следующие ключи папки были добавлены Regasm, но НЕ были добавлены моей WiX установки (соответствующие значения были добавлены Regasm, но я не буду размещать все)

HKLM\SOFTWARE\Classes\Interface\{6D8A24A9-9723-4934-9852-D8877BBBB9F6} 
HKLM\SOFTWARE\Classes\Interface\{6D8A24A9-9723-4934-9852-D8877BBBB9F6}\ProxyStubClsid32 
HKLM\SOFTWARE\Classes\Interface\{6D8A24A9-9723-4934-9852-D8877BBBB9F6}\TypeLib 
HKLM\SOFTWARE\Classes\Interface\{721AE779-4A04-4FFE-B317-FE2355DE31FA} 
HKLM\SOFTWARE\Classes\Interface\{721AE779-4A04-4FFE-B317-FE2355DE31FA}\ProxyStubClsid32 
HKLM\SOFTWARE\Classes\Interface\{721AE779-4A04-4FFE-B317-FE2355DE31FA}\TypeLib 
HKLM\SOFTWARE\Classes\Interface\{A001212B-8F67-42B6-BAA6-D61D6B34FC26} 
HKLM\SOFTWARE\Classes\Interface\{A001212B-8F67-42B6-BAA6-D61D6B34FC26}\ProxyStubClsid32 
HKLM\SOFTWARE\Classes\Interface\{A001212B-8F67-42B6-BAA6-D61D6B34FC26}\TypeLib 
HKLM\SOFTWARE\Classes\Interface\{F293DBB5-471C-4D71-80CB-C3B30EBDFE10} 
HKLM\SOFTWARE\Classes\Interface\{F293DBB5-471C-4D71-80CB-C3B30EBDFE10}\ProxyStubClsid32 
HKLM\SOFTWARE\Classes\Interface\{F293DBB5-471C-4D71-80CB-C3B30EBDFE10}\TypeLib 

Кажется, что мой wix install добавляет ключи реестра в Wow6432Node. Regasm добавляет ключи к обоим.

HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{6D8A24A9-9723-4934-9852-D8877BBBB9F6} 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{6D8A24A9-9723-4934-9852-D8877BBBB9F6}\ProxyStubClsid32 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{6D8A24A9-9723-4934-9852-D8877BBBB9F6}\TypeLib 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{721AE779-4A04-4FFE-B317-FE2355DE31FA} 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{721AE779-4A04-4FFE-B317-FE2355DE31FA}\ProxyStubClsid32 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{721AE779-4A04-4FFE-B317-FE2355DE31FA}\TypeLib 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{A001212B-8F67-42B6-BAA6-D61D6B34FC26} 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{A001212B-8F67-42B6-BAA6-D61D6B34FC26}\ProxyStubClsid32 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{A001212B-8F67-42B6-BAA6-D61D6B34FC26}\TypeLib 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{F293DBB5-471C-4D71-80CB-C3B30EBDFE10} 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{F293DBB5-471C-4D71-80CB-C3B30EBDFE10}\ProxyStubClsid32 
HKLM\SOFTWARE\Classes\Wow6432Node\Interface\{F293DBB5-471C-4D71-80CB-C3B30EBDFE10}\TypeLib 

Другая разница я заметил, что теплота имеет следующую запись для каждого класса, тогда как Regasm не имеет его

HKLM\SOFTWARE\Classes\Wow6432Node\CLSID\{FB1D6314-4409-46E9-BD92-DDD99D110CDE}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}\: "" 

Я читал, что это не имеет значения, где интерфейсы регистрируются как они не зависят от битности, однако, после сравнения того, что делает regasm, и какой жары собирает, кажется, что если интерфейсы не добавляются в реестр x64 и x32, то это не сработает.

Только первый элемент RegistryValue из моего фрагмента интерфейса, собранного с использованием тепла, выглядит следующим образом. Это добавляет элемент в Wow6432Node.

<Fragment> 
    <DirectoryRef Id="MYAPPCOMINTEROP"> 
    <Component Id="Com_Interop_TLB" Guid="{F8F60B35-0270-4569-8F0F-9D09398C72D8}"> 
     <File Id="fil460187E36ECD90A7A9A00591ADB1C5CB" Name="MYComConnect.tlb" KeyPath="yes" Source="..\..\MYComConnectReferencedDLL\MYComConnect.tlb" /> 
     <RegistryValue Root="HKCR" Key="Interface\{6D8A24A9-9723-4934-9852-D8877BBBB9F6}" Value="_MYAppConnect" Type="string" Action="write" /> 

Таким образом, в отсутствие другого решения я хочу следовать тому, что Regasm делает с записями реестра, как я могу добиться того, что с моей Wix XML.

Edit - Дополнительная информация

  1. Целевой компьютер Win 7 x64 с Office 2010 x86
  2. My Main App имеет Target x86 CPU
  3. Com Visible .dll Target процессор AnyCPU (dll используется Office и моим приложением)
  4. MSI - x64 (поскольку у меня уже есть контекстное меню .dll, которое должно записывать элементы реестра на x64, чтобы Windows x64 Explorer читал м.

Я надеюсь, что это не усложнять, но то, что мой COM DLL Visible делает allows me to call code in a VSTO addin. Я не думаю, что этот код необходимо, как я могу получить свой собственный объект из офиса и бросил его на мой пользовательский интерфейс без каких-либо проблем, если я используйте regasm для регистрации моей .dll и создания файла tlb.

Я фактически незарегистрировал все на своем компьютере разработки и установил свой последний MSI. My .dll работает, и я могу использовать свой интерфейс. Какие предположения я могу сделать из этого?Я предполагаю, что проблема связана с моей Com .dll и ее построением, и поэтому моя проблема не имеет ничего общего с моей уборкой тепла и кодировкой wix xml.

Обновление 2 проблемы Я получил второй компьютер с Visual Studio на нем. Я скопировал проект Com .dll на нем и построил его. Я создал файл .tlb с Tlbexp.exe на этом компьютере. Затем я установил это с моей MSI, и теперь я могу использовать COM-интерфейс.

Так что теперь мне нужно разобраться, зачем строить его на одном ПК, он работает, а с другой - нет. Самое главное отличие сейчас в том, что на ПК, который работает, есть Win 7 на нем, тот, который не работает, - это Win 10.

ответ

0

Это может помочь узнать о битте вашего приложения и ваших MSI-строках.

32-разрядное приложение будет иметь 32-битное представление реестра и потребует ссылки на CLSID для 32-разрядных COM-библиотек. Записи интерфейса могут ссылаться на CLSID ProxyStub, который также должен быть 32-битным, а это значит, что записи интерфейса имеют битность. В любом случае, это мое понимание, поэтому вашим COM Dll нужны CLSID и ссылки на интерфейс в HKCR (HKL \ Software \ Classes) как на родном, так и на 32-битном WoW6432, если у него есть как 64, так и 32-битные абоненты.

В WiX вы добавили Win64 = yes к компоненту, чтобы сделать его 64-разрядным. Если у вас есть 32 и 64-битные абоненты для вашего COM, тогда в 64-разрядной MSI вы добавите 32 и 64-битные компоненты для своего COM, а в отдельный 32-разрядный MSI - только 32-битные компоненты. Heat не знает битов вашего окончательного MSI, поэтому вам придется использовать Win64 для компонентов, чтобы настроить нужный реестр.

 Смежные вопросы

  • Нет связанных вопросов^_^