3

C# には、アプリケーション ディレクトリ内にない場合に外部 dll をロードする ResolveEventHandler イベントがあります。

winform アプリケーションで使用するには、次のように Program.cs Main() 関数にイベントを登録します。

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);

そして、イベントが発生するたびに呼び出される ResolveAssembly 関数があります。

    static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
    {
        //MessageBox.Show(String.Format("Assembly {0} is missing", args.Name));


        //This handler is called only when the common language runtime tries to bind to the assembly and fails.

        //Retrieve the list of referenced assemblies in an array of AssemblyName.
        Assembly MyAssembly, objExecutingAssemblies;
        string strTempAssmbPath = "";
        string AssemblyName = new AssemblyName(args.Name).Name;

        objExecutingAssemblies = Assembly.GetExecutingAssembly();
        AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();

        //Loop through the array of referenced assembly names.
        foreach (AssemblyName strAssmbName in arrReferencedAssmbNames)
        {
            //Check for the assembly names that have raised the "AssemblyResolve" event.
            if (strAssmbName.Name == AssemblyName)
            {
                //Build the path of the assembly from where it has to be loaded.                
                strTempAssmbPath = @"C:\PowerVision\libraries\" + AssemblyName + ".dll";
                break;
            }

        }
        //Load the assembly from the specified path.                    
        MyAssembly = Assembly.LoadFrom(strTempAssmbPath);

        //Return the loaded assembly.
        return MyAssembly;
    }

問題は、このイベントをクラス ライブラリに追加/呼び出しするにはどうすればよいかということです。

外部 DLL への参照が 3 つあるクラス ライブラリ (DLL) があります。これらの dll をアプリケーション ディレクトリにコピーしたくないし、アプリケーションのサブディレクトリに配置したくありません。これらの DLL は、特定の外部フォルダーに保持する必要があります (したがって、イベントを使用します)。

問題は、DLL (クラス ライブラリ) のどこにこのイベント登録を配置するかわからないことです。

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
4

1 に答える 1

1

3 つの外部 DLL のいずれかが参照される前に呼び出される場所に、イベント登録を DLL に配置するだけです。

最上位の DLL 内のオブジェクトのコンストラクターが最初に確認されます。ただし、そのオブジェクトがこれら 3 つの外部 DLL のいずれかにあるオブジェクトのサブタイプである場合、そのオブジェクトの親オブジェクトを作成し、最初に親オブジェクトを呼び出し、そのオブジェクトにイベント登録を追加する必要がある場合があります。親のコンストラクタ。

たとえば、DLL が、次のように、これら 3 つの外部 DLL のいずれかにある別の UserControl に基づく UserControl である場合:

public partial class TopLevelUserControl: ExternalDllUserControl
{
    InitializeComponent();
}

次に、次のようなコードを記述する必要がある場合があります。TopLevelUserControlLauncher という名前の新しいユーザー コントロールを作成し、TopLevelUserControl をその userControl にドッキングして配置します。次に、次のようなコードを記述します。

public partial class TopLevelUserControlLauncher: UserControl
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
    InitializeComponent(); // this will construct TopLevelUserControl
}
于 2013-07-15T03:15:36.210 に答える