2016-01-01 85 views
0

我正在嘗試部署新的.net Com可見接口。安裝後,我的新的.dll可以被我的應用程序加載。有一個要求是轉換其中一個不工作的接口。部署和註冊Com Interop接口

我正在使用Heat來收穫我的wix xml。

"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添加,但不是由我威克斯添加安裝(對應值也由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和熱量收穫之後,不要依賴bitness,但是如果接口沒有被添加到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中,我怎麼能做到這一點與我的維克斯XML。

編輯 - 進一步的信息

  1. 目標計算機是Win 7的64位與Office 2010的86
  2. 我的主要應用有目標CPU 86
  3. 的COM可見的.dll目標CPU值爲anycpu(該DLL由Office和我的應用程序使用)
  4. MSI是x64(因爲我已經有一個上下文菜單.dll需要將註冊表項寫入x64,以便Windows的x64資源管理器將讀取米

我希望這不會使事情變得複雜,但什麼我的COM可見DLL確實是allows me to call code in a VSTO addin.我不認爲這個代碼是必要的,因爲我可以從辦公室讓我的自定義對象和它沒有任何問題投給我的自定義界面,如果我使用regasm註冊我的.dll並創建tlb文件。

我實際上在我的開發PC上沒有註冊任何東西,並安裝了我的最終MSI。我的.dll工作,我可以投我的界面。我能從中得出什麼假設?我假設問題出在我的Com.dll上並構建它,因此我的問題與我的散熱收集和wix xml編碼無關。

更新2的問題 我獲得了第二臺PC上的Visual Studio上。我複製了我的Com .dll項目並構建它。我在這臺PC上用Tlbexp.exe創建了.tlb文件。然後我用MSI安裝了這個,我現在可以投射COM接口。

因此,我現在必須弄清楚爲什麼在一臺PC上構建它,而在另一臺上則不行。現在最主要的區別是,PC上運行的是Win 7,不能運行的是Win 10.

回答

0

這可能有助於瞭解您的應用程序和MSI構建的位數。

32位應用程序將具有32位註冊表視圖,並且需要CLSID引用32位COM dll。接口條目可能指的是ProxyStub CLSID,它也需要是32位,這意味着接口條目具有比特性。這是我的理解,所以你的COM Dll需要在本地和32位WoW6432中的HKCR(HKL \ Software \ Classes)中使用CLSID和接口引用(如果它同時具有64位和32位調用方)。

在WiX中,您需要將Win64 = yes添加到組件以使其成爲64位。如果您的COM具有32位和64位調用方,那麼在64位MSI中,您將爲COM添加32位和64位組件,並在單獨的32位MSI中添加32位組件。 Heat並不知道最終MSI的位數,所以您可以在組件上使用Win64來定位所需的註冊表視圖。