2017-07-07 44 views
0

我需要你的幫助。獨立VB.NET應用免註冊COM - 複雜案例

我讀了整個互聯網關於無註冊COM/DLL,但我的問題更復雜。

我準備在VB.NET中的應用程序,將在用戶沒有管理權限的環境中使用,所以我不能簡單地安裝它或註冊COM。這個COM是由Microsoft設計的LogParser庫。 DLL也不一定要嵌入 - 會很好,但它可能也會從啓動提取exe文件 - 我可以用這種方法

通常在主窗體中我有一個按鈕調用另一種形式是: LogParser_Form.Show()

這另一種形式「進口MSUtil」,這是一個Interop.MSUtil.dll並且其embeeded通過Fody Costura到exe插件。 表格還包含了在COM中定義的變量,例如多次聲明一個類: 昏暗IISW3CLOG作爲新COMIISW3CInputContextClass (不止一個)

但是這個DLL的地方指的是更大:LogParser.dll這實際上可以一個需要註冊的COM組件,所以當單擊按鈕時,我的LogParser_Form不會出現,但它會拋出COM組件未找到的異常... 不幸的是,Fody Costura或Ilmerge不能用於COM ...

我試過多個技巧,至少有清單文件等,但沒有運氣......

你是我最後的希望 - 請幫助我...如何嵌入這個COM exe文件沒有註冊? 我認爲正確使用的清單文件可能會有幫助,但我沒有找到成功使用它的方法...

回答

1

獲得註冊免費COM工作可能會很棘手,但配置正確時工作。關鍵問題是創建清單,它記錄所有必需的依賴關係。在你的情況,你就需要兩個體現:

  • 客戶機清單爲您的應用
  • 服務器清單的LOGPARSER的圖書館。這部分需要一個分析類型庫的工具,比如OLE/COM Object Viewer(oleview.exe)。它允許查看LogParser.dll中的嵌入式類型庫。

讓我們來看看LogParser幫助文件中記錄的(稍作修改的)C#示例。在這種情況下,客戶端被命名爲「logqryclient.exe」,並且已經通過類型庫導入器(tlbimp)創建了Runtime Callable Wrapper。

using System; 
using Interop.MSUtil; 

namespace logqryclient 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       // Instantiate the LogQuery object 
       ILogQuery oLogQuery = new LogQueryClassClass(); 

       // Create the query 
       string query = @"SELECT TOP 50 SourceName, EventID, Message FROM System"; 

       // Execute the query 
       ILogRecordset oRecordSet = oLogQuery.Execute(query, null); 

       // Browse the recordset 
       for (; !oRecordSet.atEnd(); oRecordSet.moveNext()) 
       { 
        ILogRecord rec = oRecordSet.getRecord(); 
        Console.WriteLine(rec.toNativeString(",")); 
       } 

       // Close the recordset 
       oRecordSet.close(); 
      } 
      catch (System.Runtime.InteropServices.COMException exc) 
      { 
       Console.WriteLine("Unexpected error: " + exc.Message); 
      } 
     } 
    } 
} 

要使用此代碼,無需註冊COM類,你首先需要將LogParser.dll放到相同的目錄客戶端可執行文件。

接下來,您需要創建一個附帶的服務器清單(此處名爲「LogParser.manifest」)。這將記錄接口的所有必需類和編組信息(線程切換所需的)。如前所述,您需要一個類型庫分析器來獲取對類和接口標識符的訪問權限。

在上述情況下,你需要標識符:

  • ILogQuery接口& LogQueryClass類
  • ILogRecordset接口
  • ILogRecord接口

因此,服務器清單可以看看如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity type="win32" name="LogParser" version="1.0.0.0" /> 
    <file name = "LogParser.dll"> 
     <!-- LogQueryClass --> 
     <comClass 
      clsid="{8CFEBA94-3FC2-45CA-B9A5-9EDACF704F66}" 
      threadingModel = "Apartment" /> 
     <!-- Embedded type library --> 
     <typelib 
      tlbid="{A7E75D86-41CD-4B6E-B4BD-CC2ED34B3FB0}" 
      version="1.0" 
      helpdir=""/> 
    </file> 
    <!-- Marshalling information for interfaces --> 
    <comInterfaceExternalProxyStub 
     name="ILogQuery" 
     iid="{3BDE06BC-89E4-42FD-BE64-832A5F33D7D3}" 
     proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" 
     baseInterface="{00000000-0000-0000-C000-000000000046}" 
     tlbid = "{A7E75D86-41CD-4B6E-B4BD-CC2ED34B3FB0}" /> 
    <comInterfaceExternalProxyStub 
     name="ILogRecordset" 
     iid="{C9452B1B-093C-4842-ABD1-F81410926874}" 
     proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" 
     baseInterface="{00000000-0000-0000-C000-000000000046}" 
     tlbid = "{A7E75D86-41CD-4B6E-B4BD-CC2ED34B3FB0}" /> 
    <comInterfaceExternalProxyStub 
     name="ILogRecord" 
     iid="{185FFF88-E24A-4984-9621-AA41BEAE8513}" 
     proxyStubClsid32="{00020424-0000-0000-c000-000000000046}" 
     baseInterface="{00000000-0000-0000-c000-000000000046}" 
     tlbid = "{A7E75D86-41CD-4B6E-B4BD-CC2ED34B3FB0}" /> 
</assembly> 

允許客戶端找到服務器清單,並最終LOGPARSER的圖書館,嵌入以下客戶機清單進入「logqryclient.exe」客戶端:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity 
     type = "win32" 
     name = "logqryclient" 
     version = "1.0.0.0" /> 
    <dependency> 
     <dependentAssembly> 
      <assemblyIdentity 
       type="win32" 
       name="LogParser" 
       version="1.0.0.0" /> 
     </dependentAssembly> 
    </dependency> 
</assembly> 

現在,所有需要的信息位於體現,以便您可以在免註冊配置中運行代碼。

+0

男人,你是清單之神(Manifestofeles?);)你不知道我一直在尋找解決方案的時間以及我製作了多少清單文件......非常感謝! – Matti