C# 来自手动加载的程序集的新实例

C# 来自手动加载的程序集的新实例,c#,C#,对于自动更新场景,我希望应用程序自动从云中拉下更新的dll。在我的VS项目中,我引用了一个程序集(v1.0.0.0)。我希望在运行时加载它的较新版本(例如v1.1.0.0),以便在我新建它时: var class1 = new Class1(); 我想从汇编版本v1.1.0.0中获取类型(Class1)的实例。这可能吗 注意:我不是在寻找一种使用反射生成实例类型Class1的方法,而是在更新它。在绑定程序集时,您需要使用来告诉加载程序为您的应用程序加载一个更新(但仍然兼容)的程序集。这是您在a

对于自动更新场景,我希望应用程序自动从云中拉下更新的dll。在我的VS项目中,我引用了一个程序集(v1.0.0.0)。我希望在运行时加载它的较新版本(例如v1.1.0.0),以便在我新建它时:

var class1 = new Class1();
我想从汇编版本v1.1.0.0中获取类型(Class1)的实例。这可能吗

注意:我不是在寻找一种使用反射生成实例类型Class1的方法,而是在更新它。

在绑定程序集时,您需要使用来告诉加载程序为您的应用程序加载一个更新(但仍然兼容)的程序集。这是您在
app.config
web.config
中执行的操作,具体取决于应用程序类型。例如(摘自上面的链接):

这假定
assemblyname
引用可以加载的已知程序集,并且
typename
位于该程序集中,并且它实现了
IInterface

使用接口可以确保编译时唯一的硬编码类型是接口,并且您可以从任何程序集中加载任何实现,只要这些实现实现了正确的接口。这使得更换各种组件变得容易

使用DI库,大部分工作都是为您完成的——各种库处理在程序集中发现实现接口的类型,然后在您请求时,它们会给您一个新实例


您还可以查看类似问题的答案,以了解更多信息:

您的问题非常不清楚。您可以设置应用程序配置以重定向版本绑定。您将获得引用所指示的类,如果需要特定版本,则应通过
CreateInstanceAndUnwrap()
加载特定程序集并加载该类型。您必须执行程序集重定向。@Pompair hi OP,你能看一下这个问题吗?我不能用这个,因为这意味着我需要事先知道dll的未来版本号,并且我必须访问客户端配置文件。这是我没有的奢侈品。该应用程序是在外地的用户,我想提供一个补丁dll通过服务器。到应用程序在应用程序启动时检查更新等。这是简单的部分,但如何替换应用程序中引用的dll?@Pompair I在答案中添加了一些细节。+1@蓬派尔,你不必知道未来的版本号。只需确保redirect语句指向某个疯狂的高位,比如v999.999.999。在这一点上应该可以。@xxbbcc你能看一下这个问题吗?@slowjams对不起,你的问题是什么意思?
<dependentAssembly>
    <assemblyIdentity name="someAssembly" publicKeyToken="32ab4ba45e0a69a1"
        culture="en-us" />
    <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
IInterface obj = (IInterface) Activator.CreateInstance ( "assemblyname",
    "typename" ).Unwrap ();