tel*_*e00 6 .net xml code-access-security
我有一个解决方案,我正在尝试从.NET 2转换为.NET 4.此解决方案中有多个项目,其中一些在C#中,其中一些在VB中.他们中的大多数使用system.xml进行XML创建和解析.
我已经将所有项目重新定位到.NET 4,并进行编译.但是,当我尝试运行时,我几乎立即得到一个System.FieldAccessException,说"如果类库中字段的访问级别已更改,请重新编译引用该库的任何程序集.".在此之前我确实重新编译了整个解决方案(之后再次尝试,没有变化).
然后,我使用程序集绑定日志查看器查看是否有任何绑定失败,因为这是在项目中引用了不同的dll时发生的.果然,那里有失败.他们在两个不同的VB项目中,他们看起来像这样:
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable <path to my exe>
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = <projname>.XmlSerializers, Version=2013.20.0.0, Culture=neutral, PublicKeyToken=null, processorArchitecture=MSIL (Fully-specified)
LOG: Appbase = <projectpath>
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = <projname>.vshost.exe Calling assembly : System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
=== LOG: This bind starts in default load context.
LOG: Using application configuration file: <project path\config file>
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///<project path>/<projname>.XmlSerializers.DLL.
LOG: Attempting download of new URL file:///<project path>/<projname>.XmlSerializers/CMG.XmlSerializers.DLL.
LOG: Attempting download of new URL file:///<project path>/<projname>.XmlSerializers.EXE.
LOG: Attempting download of new URL file:///<project path>/<projname>.XmlSerializers.EXE.
LOG: All probing URLs attempted and failed.
Run Code Online (Sandbox Code Playgroud)
果然,我的obj文件夹中没有任何文件.但是之前也没有,而且它运作良好.(注意:这些绑定错误仅出现在使用XML的两个VB项目中,而不是C#中.)我删除并重新添加了对system.xml的引用,清理了解决方案,并重建了 - 仍然没有.
我检查过,system.xml v4在GAC中,公钥与它在这里寻找的相同.我在构建选项卡上看到了对名为"生成序列化程序集"的项目选项的引用.在VB项目中,它位于Compile> Advanced选项下.它被设置为自动.我试过打开它,重建,没有改变.我不知道下一步该往下看 - 这对我来说是一个全新的领域.那么这个文件应该从哪里来,为什么它不存在,为什么它在没有它的情况下在v2中工作?或者所有这些xml的东西都是红鲱鱼而与原始问题无关?我开始担心这一点,但不管怎么说还不能确定.任何指导都将受到高度赞赏.
ETA:如果我在VS之外运行,则错误日志将崩溃显示为事件1000,其中包含"错误模块名称:kernelbase.dll".到目前为止我对此进行的搜索表明在64位操作系统上运行的32位应用程序存在问题,但我已将整个设置编译为任何CPU.事实证明,当我运行.NET 2版本时,我也看到了相同的绑定错误,即使它在那里运行良好.我开始越来越多地认为XML是一个红色的鲱鱼.
进一步的ETA:XML的确是一个红色的鲱鱼.添加解决方案作为下面的答案.
所以这毕竟是安全问题。根据http://msdn.microsoft.com/en-us/library/stfy7tfc.aspx:
如果成员具有 SecurityCriticalAttribute、属于具有 SecurityCriticalAttribute 的类型或者位于安全关键程序集中,则该成员是安全关键成员。从 .NET Framework 4 开始,访问安全关键成员的规则如下:
透明代码不能使用反射来访问安全关键成员,即使代码是完全可信的。抛出 MethodAccessException、FieldAccessException 或 TypeAccessException。
以部分信任运行的代码被视为透明的。
进一步阅读,我发现随着 .NET 4 中的这一变化,他们实际上为这些规则引入了 2 个级别 - 级别 2 是这些新规则,级别 1 是 .NET 2 规则,以实现向后兼容性。我通过添加以下内容来设置无法访问的程序集以使用 1 级规则:
<Assembly: System.Security.SecurityRules(System.Security.SecurityRuleSet.Level1)>
Run Code Online (Sandbox Code Playgroud)
到 AssemblyInfo.vb 文件(并添加 system.security 作为参考)。现在一切正常。显然,理想的情况是将其更改为使用 2 级规则,但这只是未来的事情。这至少不仅暂时解决了问题,而且告诉我到底问题是什么。感谢大家!
| 归档时间: |
|
| 查看次数: |
466 次 |
| 最近记录: |