2017-05-09 10 views
0

登録無料のCOMを使用するようにアプリケーションを変換しています。通常、regsvr32が呼び出されるサードパーティのCOM DLLがいくつかあります。私は、これらのサードパーティ製のDLLからオブジェクトを作成することができるかどうかテストしました。.NETでTLBファイルをトラバースしてCOMエントリを表示する方法はありますか?

Windowsに組み込まれたOLE/COMビューアを使用してこの情報を取得しました。しかし、これらのサードパーティライブラリにはマニフェストに必要なクラスがたくさんあるため、私は手動でこれを行うことができるプログラムを作りたいと思います。

プログラマチックにタイプライブラリをトラバースする方法を知っている人はいますか?

+0

これを難しいやり方にする理由はあまり明確ではありません。参照のプロパティウィンドウでIsolated = Trueを設定するだけで、そこからすべて自動化されます。この機能を再発明する、まあ、ああ。タイプライブラリは十分ではないことに注意してください。コンポーネントのプロキシ/スタブについては何も知りません。 LoadTypeLib()で型ライブラリを読み込みます。 –

+0

私は.NETプロジェクトからこれをやろうとしていません – matrixugly

+0

[c#]と[.net]タグを使用する点はあまりありません。あなたが望む.manifestファイルを生成する最も簡単な方法です。 –

答えて

1

私はHansの助言を受けて、LoadTypeLibを使用しました。

例コードを探している人にとっては、これは素晴らしい出発点になるはずです。 私は今朝それを書いて、必要なXMLを手に入れることができました。

私はオブジェクトを解放しないために私を許して!私は今、この答えの残りの部分を完全に肉付けする時間がありません。編集は大歓迎です。

[DllImport("oleaut32.dll", PreserveSig = false)] 
    public static extern ITypeLib LoadTypeLib([In, MarshalAs(UnmanagedType.LPWStr)] string typelib); 

    public static void ParseTypeLib(string filePath) 
    { 

     string fileNameOnly = Path.GetFileNameWithoutExtension(filePath); 
     ITypeLib typeLib = LoadTypeLib(filePath); 

     int count = typeLib.GetTypeInfoCount(); 
     IntPtr ipLibAtt = IntPtr.Zero; 
     typeLib.GetLibAttr(out ipLibAtt); 

     var typeLibAttr = (System.Runtime.InteropServices.ComTypes.TYPELIBATTR) 
      Marshal.PtrToStructure(ipLibAtt, typeof(System.Runtime.InteropServices.ComTypes.TYPELIBATTR)); 
     Guid tlbId = typeLibAttr.guid; 

     for(int i=0; i< count; i++) 
     { 
      ITypeInfo typeInfo = null; 
      typeLib.GetTypeInfo(i, out typeInfo); 

      //figure out what guids, typekind, and names of the thing we're dealing with 
      IntPtr ipTypeAttr = IntPtr.Zero; 
      typeInfo.GetTypeAttr(out ipTypeAttr); 

      //unmarshal the pointer into a structure into something we can read 
      var typeattr = (System.Runtime.InteropServices.ComTypes.TYPEATTR) 
       Marshal.PtrToStructure(ipTypeAttr, typeof(System.Runtime.InteropServices.ComTypes.TYPEATTR)); 

      System.Runtime.InteropServices.ComTypes.TYPEKIND typeKind = typeattr.typekind; 
      Guid typeId = typeattr.guid; 

      //get the name of the type 
      string strName, strDocString, strHelpFile; 
      int dwHelpContext; 
      typeLib.GetDocumentation(i, out strName, out strDocString, out dwHelpContext, out strHelpFile); 


      if (typeKind == System.Runtime.InteropServices.ComTypes.TYPEKIND.TKIND_COCLASS) 
      { 
       string xmlComClassFormat = "<comClass clsid=\"{0}\" tlbid=\"{1}\" description=\"{2}\" progid=\"{3}.{4}\"></comClass>"; 
       string comClassXml = String.Format(xmlComClassFormat, 
        typeId.ToString("B").ToUpper(), 
        tlbId.ToString("B").ToUpper(), 
        strDocString, 
        fileNameOnly, strName 
        ); 
       //Debug.WriteLine(comClassXml); 
      } 
      else if(typeKind == System.Runtime.InteropServices.ComTypes.TYPEKIND.TKIND_INTERFACE) 
      { 
       string xmlProxyStubFormat = "<comInterfaceExternalProxyStub name=\"{0}\" iid=\"{1}\" tlbid=\"{2}\" proxyStubClsid32=\"{3}\"></comInterfaceExternalProxyStub>"; 
       string proxyStubXml = String.Format(xmlProxyStubFormat, 
        strName, 
        typeId.ToString("B").ToUpper(), 
        tlbId.ToString("B").ToUpper(), 
        "{00020424-0000-0000-C000-000000000046}" 
       ); 
       //Debug.WriteLine(proxyStubXml); 
      } 

     } 

     return; 
    } 
} 
関連する問題