2

最初に何をしようとしているのか (およびその理由) を説明し、次に詳細を説明します。

JIT でコンパイルされた言語のコンテキストで、Registration Free COM アクティベーションを機能させようとしています。Reg-Fre COM を使用しているのは、COM コンポーネントを登録する必要がないようにし、このアプリケーションを管理者権限なしでインストールできるようにしたいからです。

JIT コンパイラはメインの実行可能ファイルであり、署名されており、マニフェストが埋め込まれています。Windows の最新バージョンでは、既定で外部マニフェストよりも埋め込みマニフェストが優先されます (Windows XP では逆でした)。JIT は署名されているため、署名を壊さずにマニフェストを抽出/変更/更新することはできません。また、これにより、アプリケーションのメンテナンスが複雑になります (常に新しいマニフェストを埋め込む必要があります)。また、私が権利を所有していないプログラムを変更することの法的影響もあります。

したがって、私の考えは、依存関係をリストするマニフェストを提供する Win32 ラッパー ライブラリを介して WinSxS アクティベーションを実行しようとすることでした。概念実証として、単純な VB6 アプリ、C++ ラッパー ライブラリ、および 2 つの COM ライブラリ (.NET に 1 つ、VB6 に 1 つ) を作成することにしました。ラッパーには、VB6 COM を呼び出すメソッド、.NET COM を呼び出すメソッド、単純な文字列を返すメソッドの 3 つのメソッドが含まれています。もちろん、COM などのすべてが登録されている限り、動作します。それらを登録解除し、COM のマニフェストを提供し、メインの実行可能ファイルのマニフェストに依存関係として追加すると、機能します。それらを登録解除し、COM と C++ ラッパーのマニフェストを提供し、C++ ラッパーの依存関係として com を追加してから、メインの実行可能ファイルのマニフェストに唯一の依存関係として C++ ラッパーを追加すると、機能します。

すべてのテストで、すべてのファイルの変更日を変更する Powershell スクリプトを実行し、アクティベーション コンテキスト キャッシュ (マニフェスト) を確実にトリップすることに注意してください。

そこから、SXSTrace.exe を使用してデバッグを開始し、COMPlus_LoadLogDir 変数を設定しました。私のマニフェストが外部にある場合、それは決して考慮されないことがわかりました。また、それを .DLL に埋め込むと、sxstrace はそれが検出され、解析され、依存関係が検出され、それらのマニフェストが検出され、ログに通常の成功したコンテキスト アクティベーション行が表示されることもわかりました。

INFO: Parsing Manifest File C:\RegFreeComWrapper\bin\vbCom.MANIFEST.
INFO: Manifest Definition Identity is vbCom,type="win32",version="1.0.0.0".
INFO: Parsing Manifest File C:\RegFreeComWrapper\bin\netCom.MANIFEST.
INFO: Manifest Definition Identity is netCom,processorArchitecture="msil",version="1.0.0.0".
INFO: Activation Context generation succeeded.
End Activation Context Generation.

ただし、ログに記載されていても、COM 呼び出しはまだ成功していません。呼び出しが .NET COM 呼び出しを通過すると、COMPlus_CLRLoadLogDir 構成パスで出力が得られます。

この場合、出力は得られません。

メインの実行可能ファイルへの依存関係として C++ ラッパーのみをリストするマニフェストを追加するとすぐに、すべてが再び機能し始めます。SXSTrace から同様の出力が得られますが、COM 呼び出しが機能するようになりました。前述のように、すべての場合において、C++ ラッパーの単純な文字列メソッドが機能します。つまり、メインの実行可能ファイルからマニフェストがなくても、.dll を見つけて呼び出すことができます。完全なマニフェスト チェーンがない場合、COM が機能しないようです: Application.Manifest > Wrapper.Manifest > COM マニフェスト

だから、ここで2つのこと... 1.私がやろうとしていることは可能ですか? (メインの実行可能ファイルのマニフェストには触れずに、自分に属する DLL のマニフェストにのみ依存関係をリストする) :)

誰かが em で何かを試すことに興味がある場合は、すべてのコード/実行可能ファイルを例として提供できます。

4

1 に答える 1

2

うまくいきました!

アクティベーション コンテキスト API を使用するように C++ ラッパーを変更し、'ActivateActCtx' を使用してコンテキスト アクティベーションを強制しました。

http://msdn.microsoft.com/en-us/library/aa374151(v=vs.85).aspx

コードをサンプルのコードでラップし、マニフェストを参照するようにしましたが、すべて正常に機能しています。メインの実行可能ファイルにマニフェストがありません!

于 2013-09-30T19:29:46.437 に答える