C# 在运行时以编程方式添加DLL

C# 在运行时以编程方式添加DLL,c#,.net,dll,C#,.net,Dll,使用C#,我在运行时创建了一个DLL,现在我想在运行时将其添加为对项目的引用 我试着使用LoadFrom方法,但不起作用 如何做到这一点?使用方法,然后使用反射在其中运行代码。您可以使用该方法在运行时动态加载程序集。这在.NET中非常简单:当项目已在运行时,您无法将dll添加到项目中。但是,您可以使用Assembly.LoadFrom(文件名)加载dll。通常,此类场景用于SOA或基于插件的项目。您可以使用接口指定类型结构,加载dll并使用它。LoadFile vs.LoadFrom 小心——这

使用C#,我在运行时创建了一个DLL,现在我想在运行时将其添加为对项目的引用

我试着使用
LoadFrom
方法,但不起作用


如何做到这一点?

使用方法,然后使用反射在其中运行代码。

您可以使用该方法在运行时动态加载程序集。

这在.NET中非常简单:

当项目已在运行时,您无法将dll添加到项目中。但是,您可以使用Assembly.LoadFrom(文件名)加载dll。通常,此类场景用于SOA或基于插件的项目。您可以使用接口指定类型结构,加载dll并使用它。

LoadFile vs.LoadFrom

小心——这些不一样 事情

LoadFrom()经过融合,可以 被重定向到另一个程序集 不同的路径,但有相同的路径 标识(如果已加载) 从上下文加载。加载文件() 完全不能通过融合结合- 装载机只是继续装载 正是来电者要求的。信息技术 既不使用加载,也不使用 从上下文加载。那么,LoadFrom() 通常会满足你的要求, 但不一定。LoadFile()用于 那些真正真正想要 所要求的。(*但是 在v2中,策略将同时应用于 LoadFrom()和LoadFile(),所以 LoadFile()不一定是 正是要求的。而且, 从v2开始,如果部件具有 它的身份在GAC,GAC 将改为使用副本。请使用 要加载的ReflectionOnlyLoadFrom() 这正是你想要的——但是,请注意 无法使用这种方式加载程序集 已执行。)

LoadFile()有一个陷阱。既然 不使用绑定上下文,其 依赖项不是自动生成的 在其目录中找到。如果他们不是 在加载上下文中可用,您可以 必须订阅 AssemblyResolve事件以绑定 对他们来说


ref

首先应该加载dll

Assembly assembly = Assembly.LoadFrom("dllPath");
然后,您可能需要将程序集添加到应用程序域

AppDomain.CurrentDomain.Load(assembly.GetName());
之后,可以从此程序集中加载任何类型

Type t = assembly.GetType("typeName");
然后使用反射,您可以对该类型执行方法

请注意,您可能需要在配置文件中添加以下内容

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="dlls folder"/>
  </assemblyBinding>
</runtime>

实际上
程序集。加载
是,而不是
LoadFrom
LoadFile

哪种情况适合你?在里面 将军,我强烈建议你 尽可能使用加载上下文


在运行时创建/添加dll需要什么?如何在运行时创建dll?是否要在运行时添加对VS项目的引用?没道理。这个问题是胡说八道。在启动程序之前,无法在运行时动态创建程序集并使用其类型。那需要一台时间机器。我有两台exe。第一个更改dll,然后第二个exe运行并使用该dll。第二个exe具有以前版本的dll。我想在第二个exe的加载事件中重新加载它,然后运行itthanks Ghyath Serhal,你能解释一下吗?我在哪里可以更改配置首先,您的应用程序是什么,它是web应用程序、windows应用程序、windows服务吗?看,每个应用程序都有一个与其关联的appdomain。要访问某个应用程序中的dll,您应该将dll添加到其appdomain中。将dll添加到appdomain时,无法更新或删除它,并且无法多次将dll添加到appdomain。因此,解决方案是,无论何时更改dll中的某些内容,都应该创建一个新的dll,您只需更改它的名称即可。创建新的dll后,您可以加载它,将其添加到appdomain并使用它。我曾经遇到过同样的问题,每次更改dll中的某些内容时,我都会创建一个新的dll,并在其名称后附加一个guid。通过这种方式,我可以将dll添加到appdomain并使用新的dll更新。为了让我帮助你,请准确地说出你不清楚的地方。谢谢Ghyath Serhal的回答。但它不起作用。因为我的代码是基于fist dll的名称编写的。我想我应该另找一条路。