2017-07-07 27 views
0

私はあなたの助けが必要です。スタンドアロンVB.NETアプリケーションの登録不要のCOM - 複雑なケース

登録無料のCOM/DLLについては、インターネット全体を読んでいますが、私の問題はより複雑です。

ユーザーが管理者権限を持たない環境で使用されるVB.NETでアプリケーションを準備しているので、simpyをインストールしたりCOMを登録することはできません。このCOMは、Microsoftによって設計されたLogParserライブラリです。 DLLも埋め込む必要はありません - いいですが、起動時にexeからも抽出されるかもしれません - このアプローチでは大丈夫です

一般にメインフォームには別のフォーム: LogParser_Form.Show()

この別のフォームは、Interop.MSUtil.dllであり、Fody Costuraアドオンによってexeにエンベッドされている、「Imports MSUtil」です。

(1以上がある)新COMIISW3CInputContextClass として 薄暗いIISW3CLOGしかし、このDLLは大きなをどこかに言及: フォームもCOMで定義された変数の複数の宣言を持つクラス、例えばが含まれていacutallyあるLogParser.dll登録が必要なCOMコンポーネントですので、LogParser_Formはボタンをクリックしても表示されませんが、COMコンポーネントが見つからないという例外がスローされます... 残念ながら、Fody CosturaまたはIlmergeはCOM用には機能しません...

ファイルなどのマニフェストを複数回試してみましたが、幸運はありません...

あなたは私の最後の希望です - 助けてください...このCOMをexeに登録せずに埋め込む方法? 正しく使用されたマニフェストファイルが役立つかもしれないが、私はそれをうまく使う方法を見つけられなかったと思います...

答えて

1

登録無料 - COMはうまく動作しません。重要な問題は、必要なすべての依存関係を文書化するマニフェストの作成です。アプリケーション

  • Log Parserツールライブラリのマニフェストサーバーのマニフェスト

    • クライアント:あなたのケースでは、2つの目録が必要になります。この部分には、OLE/COMオブジェクトビューア(oleview.exe)などのタイプライブラリを分析するためのツールが必要です。 LogParser.dll内の埋め込みタイプライブラリを調べることができます。

    LogParserヘルプファイルに記載されている(わずかに変更された)C#の例を考えてみましょう。この場合、クライアントの名前は "logqryclient.exe"で、ランタイム呼び出し可能ラッパーはタイプライブラリインポーター(tlbimp)を介して作成されています。

    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> 
    

    は、クライアントがサーバーマニフェスト、最終的にLog Parserツールのライブラリを見つけることができるようにするには、「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

    Man、あなたはマニフェストの神です(Manifestofeles?);)私が解決策を探していた時間と、マニフェストファイルの数は分かりません...ありがとうございます! – Matti

    関連する問題