1

Windows アプリケーション内にプラグインとして存在する .Net コンポーネントを開発しています。このプラグインは、regasm を使用してクライアント マシンに登録されます。私のコンポーネントは依存関係のほとんどを埋め込み、要求されたときにアセンブリを AppDomain に返します。単一の dll で regasm を実行しようとすると、フォルダー内の依存関係が見つからないため失敗します。これは、コンポーネントをクライアント マシンにインストールするときに問題になります。

埋め込まれたdllを取得する場所をregasmに伝える方法はありますか?

私がこれまでに試したこと:

  1. コンポーネントを近くの dll に登録し、単一の dll をランタイム フォルダーにコピーします。私のコンポーネントは動作し、dll は実行時に検出されますが、これは展開のオプションではありません。

  2. ComRegisterFunctionAttribute を使用してフックインします。これは、dll が近くにある場合にのみ呼び出されるため、#1 よりも優れているわけではありません。

regasm が呼び出されるという事実を制御することはできません。コンポーネントを単一の dll にする必要はありません、この問題を解決できれば、展開がかなり簡単になります。

4

2 に答える 2

1

新しい答え:

[ComRegisterFunction]あなたは、他のアセンブリのいずれかから型を参照するクラスのメソッドを超えていると推測しています。クラスまたはメソッド内のいずれかの型のアセンブリが見つからないため、ComRegister メソッドを JIT コンパイルできないため、コードは実行されない可能性があります。

外部依存関係 (.net フレームワーク以外) を持たないクラスを作成し、そのクラスに ComRegisterFunction 属性を配置してみてください。そこでインストール作業を行いますが、カスタム コードを使用して外部アセンブリを見つけることができるように、他の種類のアセンブリのみを動的にロードします。

于 2012-06-28T20:45:31.610 に答える
-1

Ld00d、私も同じ問題を抱えていました。これをどのように行いましたか:「COM 登録済み dll の参照を削除しました」? 私には魔法のように聞こえます。ildasm を使用してから ilasm を使用しましたか?

この regasm.exe の深刻な問題に対する解決策はないと思います。

regasm.exe は[ComRegisterFunction]、以前のアセンブリの検証がGetReferencedAssemblies成功した場合にのみメソッドを呼び出します。これらの参照を削除するために dll を ildasm してから ilasm しようとするかもしれませんが、混乱を招く可能性があると思います。また、コードを使用しないとどうなるかわかりません。

私の回避策:

  1. インストール中に、regasm.exe によって要求されたこれらの DLL を DLL のフォルダーにコピーします。

  2. regasm.exe が DLL の登録を完了した直後にそれらを削除します。

良くありません (インストーラー ソフトウェアは多くのディスク領域を消費します) が、動作します。

于 2014-03-27T14:27:25.340 に答える