私はしばらくの間これに夢中になっていて、私がやろうとしていることは不可能であるという結論に近づいていますが、Stack Overflowの人々に、うまくいけば私が間違っていることを証明する機会を与えてから、別の戦略。
私がやろうとしていること 私のプロジェクトは、ブラウザで実行することを目的としたActiveXコントロール(コントロールA)としてCOMに公開される.NETアセンブリです。コントロールAからRegistrationFreeCOMを介して使用しようとしているサードパーティのActiveXコントロール(コントロールB)に依存しています。
したがって、目的のスタックは次のようになります。
Internet Explorer
[COM]
Axe Control A(My Control)
[Reg-Free COM]
Axe Control B(サードパーティ)
これを実行しようとしている 理由コントロールBを使用する別のアプリケーションとのバージョンの競合があり、コントロールBがバージョン管理を正しく実装しなかった(同じGUIDを持つ2つの非互換バージョンが存在する)ため、登録なしのCOMを使用したいと思います。登録不要のCOMは、コントロールBの2つのバージョンを互いに分離するための唯一の実行可能な方法のようです。
ブラウザーが登録不要のCOMを介してコントロール(コントロールA)を呼び出す必要はありません。通常のメカニズムを使用することを計画しました。
私がこれまでに行ったこと ブラウザがこのスタック全体を実行する究極のアプリケーションであり、ユーザーにInternet Explorerのマニフェストファイルを追加させることは実用的または推奨されないことを考えると、私のアプローチはコントロールAにマニフェストして、登録不要のCOMを使用してコントロールBを呼び出すようにします。
マニフェストをコントロールAに埋め込むことができ、サードパーティのツールを使用して、マニフェストが実際に埋め込まれていることを確認しました。テストのために物事を単純化するために、私はブラウザーを方程式から外し、単純なC#フォームアプリケーションから登録不要のCOMをテストしてきました。ただし、その環境では登録不要のCOMを動作させることができないようです。
テストの目的で、コントロールAに埋め込んだ情報を使用して、テストフォームアプリケーションのマニフェストを作成しました。その構成では、コントロールBが登録されているかどうかに関係なく機能します。私のアプリケーションがブラウザではなくそのテストアプリケーションで実行される場合、これは素晴らしいことです。このテストは、埋め込んだマニフェストが正しいことを確認するためだけに行いました。これは確認済みだと思います。
動作しない意味 テストWindowsフォームアプリケーションは完全に実行され、コントロールBが登録されている間、コントロールAと(ネストされた)コントロールBが表示されます。ただし、コントロールBの登録を解除し、登録のないCOMに依存しようとすると、アプリケーションはすぐに次のエラーをスローします(UFV =コントロールA)。
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Runtime.InteropServices.COMException
Stack:
at System.Windows.Forms.AxHost.CreateInstance()
at System.Windows.Forms.AxHost.GetOcxCreate()
at System.Windows.Forms.AxHost.TransitionUpTo(Int32)
at System.Windows.Forms.AxHost.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean)
at System.Windows.Forms.Control.CreateControl(Boolean)
at System.Windows.Forms.AxHost.EndInit()
at UniversalFileViewer.UFV.InitializeComponent()
at UniversalFileViewer.UFV..ctor()
at TestFormsProject.TestForm.InitializeComponent()
at TestFormsProject.TestForm..ctor()
at TestFormsProject.Program.Main()
私の質問
(1)間違った木を吠えていますか?つまり、私が試みているように、スタックの途中で登録なしのCOMを使用することも可能ですか、それともマニフェストをEXEファイル自体(またはマニフェストファイル)に埋め込む必要がありますか?
(2)これが不可能な場合、マニフェストマージツール(MT.EXE)でマニフェストをDLLファイルに埋め込むことができるのはなぜですか?
(3)可能であれば、どこかで足りないのですか?これを行うためのトリックはありますか?