gpt4 book ai didi

c# - DLL 中的 ResolveEventHandler(类库)

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:04 24 4
gpt4 key购买 nike

在 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);

最佳答案

您只需将事件注册放在您的 DLL 中的某个位置,该位置在您的 3 个外部 DLL 中的任何一个被引用之前的某个时间被调用。

顶级 DLL 中对象的构造函数将是第一个要查找的地方。但是,如果该对象是这 3 个外部 DLL 之一中的对象的子类型,那么您可能需要为该对象创建一个父对象,并首先调用父对象,然后在其中添加事件注册 parent 的构造函数。

例如如果您的 DLL 是一个基于另一个 UserControl 的 UserControl,该 UserControl 位于这 3 个外部 DLL 之一中,如下所示:

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

那么您可能需要编写如下代码:创建一个名为 TopLevelUserControlLauncher 的新用户控件,并将 TopLevelUserControl 放置在该用户控件中,停靠。然后这样写代码:

public partial class TopLevelUserControlLauncher: UserControl
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
InitializeComponent(); // this will construct TopLevelUserControl
}

关于c# - DLL 中的 ResolveEventHandler(类库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14626773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com