sta*_*ica 7 .net dtd app-config
我试图在我的内部定义和使用DTD实体App.config.例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration [
<!ENTITY dataSource ".\SQLEXPRESS">
]>
<configuration>
<appSettings>
<add key="FooDataSource" value="&dataSource;" />
</appSettings>
<connectionStrings>
<add name="Foo" connectionString="Data Source=&dataSource;;Integrated Security=SSPI;" />
</connectionStrings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
使用System.Configuration.ConfigurationManager读appSettings或connectionStrings不会引发错误,但它也不能解决DTD实体.
(有时程序根本不会执行.我不知道为什么.NET有时会抱怨配置错误.)
我对DTD的使用是否不正确,或者.NET不支持自定义DTD实体App.config?
System.Configuration 使用默认的 XmlReaderSettings 来确定如何读取 .config 文件。其中具有 ProhibitDtd 属性。你可以用这段代码看到它的默认值:
Console.WriteLine(new XmlReaderSettings().ProhibitDtd);
Run Code Online (Sandbox Code Playgroud)
输出:真
这就是为什么您的 .config 文件不起作用的简单解释。没有任何方法可以将其配置为覆盖该设置。
解释为什么你的程序启动困难需要更多的努力。第一次读取文件的时间非常早,甚至在 CLR 启动之前。引导程序需要读取 .config 文件来确定要加载哪个版本的 CLR,该<requestedRuntime>元素很重要。它不使用完整的 XML 解析器,而是一个非常精简的解析器,删除了所有 DTD 解析位。你可以通过下载SSCLI20看到它,XML解析器存储在clr/src/xmlparser子目录中。确切的可能出错的地方尚不清楚,但如果该解析器对 .config 文件有任何问题,那么您将无法找出问题所在。这种情况发生得太早,无法生成任何合理的诊断。检查“输出”窗口中是否有可能给出提示的退出代码编号。
| 归档时间: |
|
| 查看次数: |
701 次 |
| 最近记录: |