我想在当前项目的单独解决方案中动态使用来自不同项目的类。我认为解决方案是将 dll 加载到我的项目中。我使用以下代码来完成我的任务并且它起作用了。
string dllPath = @"the path of my dll";
var DLL = Assembly.LoadFile(dllPath);
foreach (Type type in DLL.GetExportedTypes())
{
if (type.Name == "targetClassName")
{
var c = Activator.CreateInstance(type);
try
{
type.InvokeMember("myMethod", BindingFlags.InvokeMethod, null, c, new object[] { "Params" });
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
break;
}
}
但是,我现在的问题是我想卸载dll,我不能这样做,因为Assembly中没有卸载方法。我找到的解决方案是我必须使用 AppDomain 加载程序集,然后卸载它。
现在这是我的主要问题。我不断得到FileNotFoundException。这是我的代码:
public class ProxyDomain : MarshalByRefObject
{
public Assembly GetAssembly(string assemblyPath)
{
try
{
return Assembly.LoadFrom(assemblyPath);
}
catch (Exception ex)
{
throw new InvalidOperationException(ex.Message);
}
}
}
private void BuildButton_Click(object sender, EventArgs e)
{
string dllPath = @"DllPath";
string dir = @"directory Path of the dll";
AppDomainSetup domaininfo = new AppDomainSetup();
domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo);
Type Domtype = typeof(ProxyDomain);
var value = (ProxyDomain)domain.CreateInstanceAndUnwrap(
Domtype.Assembly.FullName,
Domtype.FullName);
var DLL = value.GetAssembly(dllPath);
// Then use the DLL object as before
}
最后一行是以下例外 Could not load file or assembly 'dll, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
我已经尝试过此链接上的解决方案,但没有任何效果对我有用...我一直遇到相同的异常。之后我想卸载域,但是我无法解决加载dll的第一个问题。如何修复我的代码?
编辑
当我在我的项目的同一个 bin 文件夹中复制预期的 dll 时,它可以工作。但是,我不想在我的项目中复制 dll。有没有办法从它的路径加载它而不将它复制到我的 bin 文件夹?
相关分类