【问题标题】:Loading same Assembly with different versions and instnatiating multiple .xaml instances加载具有不同版本的相同程序集并实例化多个 .xaml 实例
【发布时间】:2016-01-27 11:04:45
【问题描述】:

这是我的问题here 的后续。

我想在不同版本中加载相同的程序集,并从这些程序集中创建多个类型的实例。

这是我所拥有的:

我有一个程序集 asm.dll,其版本(在 AssemblyInfo.cs 中)设置为 1.0.0.0。

然后,我修改了一些代码并将版本增加到 2.0.0.0 并再次构建为 asm.dll。

现在,我有 dir1/asm.dll 和 dir2/asm.dll。

这是我的工作:

assembly = Assembly.LoadFile(assemblyFile);

var types = assembly.GetTypes();

Type type = types.First<Type>(t => t.Name.Equals(backboneMemberClass + "Editor"));

MyObject myObject = (MyObject)assembly.CreateInstance("theClassIWantToInstantiate", false, BindingFlags.CreateInstance, null, new object[] { }, null, null);

问题来了:

如果我使用“dir1/asm.dll”作为程序集文件,上述工作正常:对assembly.CreateInstance(...) 的调用返回我请求的实例。

如果我再次使用“dir2/asm.dll”它仍然可以正常工作。 Assembly.CreateInstance 返回正确的实例。

但是,如果我再次想创建一个我之前已经创建的对象的实例(通过调用 Assembly.CreateInstance),我会收到以下异常:

A first chance exception of type 'System.Exception' occurred in PresentationFramework.dll
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll

我正在加载的类是 .xaml WPF UserControl,异常的 Stacktrace 表明 .xaml.cs 文件中的 InitializeComponent() 正在抛出异常,因为它找不到 .baml 文件。

【问题讨论】:

    标签: c# .net version instance .net-assembly


    【解决方案1】:

    在这个问题上苦苦挣扎了一周后,我终于找到了问题的原因和解决方案。

    问题在于自动生成的*.g.i.cs 文件,该文件由UserControl 的InitializeComponent() 方法调用,如下所示:

    此文件生成一个字符串(一个资源定位器),表示该 xaml 组件的路径,如下所示:

    现在,如果您有同一个程序集的多个版本并且两个版本都包含相同的 xaml 文件,WPF 不知道要实例化哪个 xaml 文件,因为资源定位器只引用程序集的名称,而不是它的版本。

    这导致TargetInvocationException,表示

    {"组件 'MyNamespace.MyUserControl' 没有由 URI '/MyAssembly;comoponent/myusercontrol.xaml' 标识的资源"}

    如下:

    对此的简单(但绝对不明显)解决方案是将程序集的版本添加到此资源定位器。这可以通过添加&lt;AssemblyVersion&gt;-tag 来修改项目的构建文件来实现,如下所示:

    此致谢:

    【讨论】:

    • 因此您不必手动管理 AssemblyVersion,您可以使用以下内容:$(ProjectDir)Properties\AssemblyInfo.cs$([System. IO.File]::ReadAllText($(AssemblyInfoFile)))$([System.Text.RegularExpressions.Regex]::Match($(AssemblyInfoContent), 'AssemblyVersion(Attribute)?((. +))'))$([System.Text.RegularExpressions.Regex]::Match($(AssemblyVersionAttr), '[0-9\.]+'))
    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多