gpt4 book ai didi

c# - 为什么我在安装 VS2012/.Net 4.5 后在 .Net 4.0 Assembly.GetCustomAttributes 上出现 ExecutionEngineException?

转载 作者:太空狗 更新时间:2023-10-29 20:39:40 28 4
gpt4 key购买 nike

真的和标题一样简单。我已经将一个解决方案从 .Net 2-3.5 升级到 .Net 4,它工作正常,然后我安装了 VS 2012 和它的 .Net 4.5,现在我在尝试反射(reflect) CustomAttributes 从使用以下代码动态生成 DLL:

Assembly assembly = Assembly.LoadWithPartialName("DavesNamespace.Custom");
var attributes = assembly.GetCustomAttributes(typeof(ChecksumAttribute), true);

无论有没有为 GetCustomAttributes 指定的类型,我都会得到异常,但只有在那时它才会抛出异常,程序集已成功加载,如果我在其中插入一个断点,我实际上可以查看 CustomAttributes 集合。

原来的 .Net 2-3.5 版本在安装了 vs2012 后仍然可以使用。

非常感谢任何帮助,我发现了一些源于 vs2012 的问题,这些问题以 ExecutionEngineExceptions 结尾,在线查找,但没有答案。该问题可以通过删除 VS2012 和 .Net 4.5 来解决,但由于我们打算在 VS2013 发布后在公司范围内迁移到它,这并不是真正的解决方案。

编辑:在执行此操作的示例应用程序中出现错误,即使应用程序是针对 4.5 构建的,仍然会抛出异常

在下面的评论中添加了堆栈跟踪(它是空的)

最佳答案

我已经针对我们的特定情况解决了这个问题,尽管我认为根本原因是 .Net 4.5 读取 DLL 上的 CustomAttributes 的方式发生了未记录的更改。

解决方案是将 CustomAttributeBuilderAssemblyBuilder.Save() 之前的最后一件事 [After all the content of the assembly has been populated] 移至第一个 AppDomain.CurrentDomain.DefineDynamicAssembly() 之后的事情 [在填充任何内容之前]

抛出异常的实际代码不需要更改,尽管我已经重构为使用 LoadWithPartialName() 的替代品,它只是 Load(), 不过,此解决方法仍然适用于 LoadWithPartialName()

可能是在程序集的内容后添加自定义属性把自定义属性放错地方了?但问题已记录在 MS 中以进行调查。

关于c# - 为什么我在安装 VS2012/.Net 4.5 后在 .Net 4.0 Assembly.GetCustomAttributes 上出现 ExecutionEngineException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17814197/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com