我有一个 C# windows 窗体,它使用位于与 EXE 位置不同的文件夹中的 Utility.dll。Utility.dll 包含一个类 UtilityClass 和一个接口 ILoadString。当我没有在 Form1.cs 类中继承 ILoadString 接口时,我可以通过 Program.cs 中的 AppDomain.AssemblyResolve 事件成功加载 Utility.dll。
当我尝试在 Form1.cs 中继承 ILoadString 接口时出现问题。当我尝试运行该项目时,我从 Visual Studio 收到一个 FileNotFoundException 说“无法加载文件或程序集'实用程序,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null'或其依赖项之一。系统找不到指定的文件。” 该控件甚至不会出现在 Program.cs 中的静态 void Main() 中。我认为 CLR 正在尝试在开始时加载 Utility.dll,因为我的 Form1.cs 正在继承 ILoadString。
注意:在添加引用 Utility.dll 的复制本地设置为“假”。所以exe文件夹不包含这个dll。
在这种情况下,如何从其他文件夹加载 Utility.dll?任何帮助表示赞赏。
提前致谢。
我在下面粘贴我的代码。
using System.Reflection;
namespace SampleForm
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{
Assembly MyAssembly, objExecutingAssemblies;
string strTempAssmbPath = "";
objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();
foreach (AssemblyName strAssmbName in arrReferencedAssmbNames)
{
if (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) == args.Name.Substring(0, args.Name.IndexOf(",")))
{
strTempAssmbPath = "D:\\Ezhirko\\SampleForm\\bin\\Common\\" +
args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
}
}
MyAssembly = Assembly.LoadFrom(strTempAssmbPath);
return MyAssembly;
}
}
我的 Windows 窗体在这里....
using Utility;
namespace SampleForm
{
public partial class Form1 : Form, ILoadString
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string Name = string.Empty;
UtilityClass obj = new UtilityClass();
Name = obj.GetName();
this.lblHello.Text = Name;
ChangeName();
}
public void ChangeName()
{
this.lblHello.Text = "InterFace Called !";
}
}
这是来自 Utility.dll 的 UtilityClass.cs
namespace Utility
{
public class UtilityClass
{
private string sName = string.Empty;
public UtilityClass()
{
sName = "My Name";
}
public string GetName()
{
return sName;
}
}
}
这是来自 Utility.dll 的接口 ILoadString.cs
namespace Utility
{
public interface ILoadString
{
void ChangeName();
}
}