【问题标题】:Dynamic invoking of arbitrary .Net-version assembly任意.Net版本程序集的动态调用
【发布时间】:2011-06-15 09:19:30
【问题描述】:

我可以从较低 .Net 版本的程序集中动态调用较高 .Net 版本的程序集吗?也许我应该使用嵌入式 DLR 语言(Iron Python)?

【问题讨论】:

    标签: c# .net dynamic-language-runtime


    【解决方案1】:

    程序集没有 .NET 版本,它有元数据版本。忽略早期的,在野外有三个不同的。分别与 .NET 1.1、.NET 2.0 和 .NET 4 一起发布的版本。中间版本(介于 2.0 和 3.5 SP1 之间的任何版本)使用版本 2.0 元数据格式。

    或者换句话说,CLR 版本才是真正重要的。这就是@Barfieldmv 的代码有效的原因,.NET 2.0 和 .NET 3.5 使用相同的 CLR 版本。对于今天更典型的问题,CLR 版本 2 无法加载具有版本 4 元数据的程序集。您必须使用版本 4 CLR 运行程序。这需要一个覆盖将要使用的 CLR 版本的 app.exe.config 文件。它应该是这样的:

    <configuration>
       <startup>
          <supportedRuntime version="v4.0"/>
       </startup>
    </configuration>
    

    【讨论】:

    • 很好的答案!但是您能否提示我,是否可以使用某些脚本引擎从 .Net 2.0/3.5 程序集调用 .Net 4 程序集?
    • 不,一个进程中只能有一个版本的 CLR。第 4 版 CLR 对此限制有一些解决方法,但如果您已加载该 CLR,则不会遇到此问题。
    【解决方案2】:

    当然可以,这个问题应该对你有所帮助:

    Loading .net 3.5 wpf-forms in a .net 2.0 application

    或者在代码中:

    Dim dllPath As String = "C:\ProjectsTest\TestSolution\ActiveXUser\bin\Debug\TestControl.dll"
    If Not File.Exists(dllPath) Then
        Return
    End If
    
    Dim loadedAssembly As [Assembly] = [Assembly].LoadFile(dllPath)
    
    Dim mytypes As Type() = loadedAssembly.GetTypes()
    
    Dim t As Type = mytypes(1)
    Dim obj As [Object] = Activator.CreateInstance(t)
    

    TestControl.dll 可以包含所有已安装的 .net 版本信息。

    【讨论】:

    • 以及如何从这个对象调用任意方法(例如静态方法)?
    • 通过反射或共享接口。
    猜你喜欢
    • 2016-03-15
    • 2010-10-27
    • 2010-10-14
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多