yamamoWorks

ログイン
in 検索
ホーム ブログ フォーラム ギャラリー ダウンロード

yamamo's Blogs

Interop.xxx.dll を配布したくない

一般的に.NETからCOMを使う場合、VS.NETの参照設定でCOMへの参照を追加しますが、その時に Interop.xxx.dll というラッパーができます。このラッパーを通じて.NETからCOMへアクセスが行われます。

Windows Form アプリケーションの場合は特に気にすることは無いのですが、はてなブックマークMenuBar のようにIEにホストされるようなアプリケーションの場合、Interop.xxx.dll をGACに登録する必要があったりします。

他の.NETアプリケーションでも同じCOMを使っていると同じ名前の Interop.xxx.dll ができるわけで、それがGACに登録されてたりするとなんか影響しそうでいやな感じです。(実際には署名とかバージョンとかで大丈夫な仕組みになってるのかな?)

そこで、Interop.xxx.dll を配布しなくて済む方法を考えたのですが、方法は2つあるようです。

 

1.Type.GetTypeFromCLSID() を利用して InvokeMember で操作する。

Type typ = Type.GetTypeFromCLSID(new System.Guid("{3050F4E7-98B5-11CF-BB82-00AA00BDCE0B}"));
object doc = ie.Document;
docTitle = typ.InvokeMember("title", BindingFlags.GetProperty, null, doc, null).ToString();
MessageBox.Show("Title is " + docTitle);

参考:MS ⇒ MSHTML のプライマリ interop アセンブリは、再頒布可能なファイルのサイズを増やします。

※ Type.GetTypeFromProgID("mhtmlfile") でもOK

 

2.必要なインターフェイスを自分で定義する

Interop.xxx.dll はインターフェース定義がされた.NETアセンブリなわけで、同じコードを自分で書いてしまえということです。
例えば WebBrowserClass なんかはこんな感じです。

[ComImport, Guid("8856F961-340A-11D0-A96B-00C04FD705A2")]
[ComSourceInterfaces("SHDocVw.DWebBrowserEvents2\0SHDocVw.DWebBrowserEvents\0")]
[TypeLibType((short) 0x22), ClassInterface((short) 0)]
public class WebBrowserClass : IWebBrowser
{
   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(100)]
   public virtual extern void GoBack();

   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0x65)]
   public virtual extern void GoForward();

   [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0x66)]
   public virtual extern void GoHome();

   [DispId(200)]
   public virtual extern object Application
   {
     [return: MarshalAs(UnmanagedType.IDispatch)]
     [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(200)]
     get;
   }

   [DispId(0xc9)]
   public virtual extern object Parent
   {
     [return: MarshalAs(UnmanagedType.IDispatch)]
     [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0xc9)]
     get;
   }

   [DispId(0xcb)]
   public virtual extern object Document
   {
     [return: MarshalAs(UnmanagedType.IDispatch)]
     [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(0xcb)]
     get;
   }
  :
  :

必要となるコードは Interrop.xxx.dll を Reflector 等で覗いてやればすぐにわかります。

この方法は定義する必要があるクラスが多いと大変ですが (^^;

公開 2006年8月4日 9:06 投稿者 やまも
タグ :

コメント

 

tkym

あるいは、アセンブリを合体させちゃうとか。

試したことはないんですが。。。

http://www.microsoft.com/downloads/details.aspx?FamilyID=22914587-b4ad-4eae-87cf-b14ae6a939b0&displaylang=en

8月 24, 2006 20:48
 

やまも

そんなモノがあったのか。

@ITの解説

http://www.atmarkit.co.jp/fdotnet/dotnettips/426ilmerge/ilmerge.html

厳密署名には対応できんのかな?

8月 25, 2006 17:59

どのような感想ですか?

(必須)
(オプション)
(必須)
登録

タグ

最近の投稿

  • お知らせ
  • NemusSync - iPod touch とGoogleカレンダーの同期!
  • 負荷増大?
  • Google Apps に対応!
  • idea*idea さんで

過去の投稿

  • 6月 2008 (2)
  • 5月 2008 (1)
  • 4月 2008 (1)
  • 2月 2008 (1)
  • 12月 2007 (1)
  • 10月 2007 (1)
  • 9月 2007 (3)
  • 8月 2007 (1)
  • 7月 2007 (2)
  • 6月 2007 (4)
  • 5月 2007 (3)
  • 4月 2007 (2)
  • 3月 2007 (8)
  • 2月 2007 (2)
  • 1月 2007 (4)
  • 12月 2006 (1)
  • 11月 2006 (3)
  • 10月 2006 (2)
  • 9月 2006 (7)
  • 8月 2006 (7)
  • 7月 2006 (6)

購読

  • RSS 2.0
  • Atom 1.0
Powered by Community Server, by Telligent Systems