“CS1595: 已在多处定义”错误详解
我最近又找到了一个方法,可能是最简单,而且最有效的。
就是把所有命名空间名称改掉,只要和原来不一样就可以。
发现这个也是在没有办法的情况最坏的办法,没想到是最有效的。我基本上把下面的方法都试过了,还是不行,权限配置也都改了,也不行,我觉得以下的方法只能参考,因为我们平常都是做WEB程序,不可能不用到mscorelib.dll。
以下是微软的解释和我的理解
http://support.microsoft.com/?id=318274
PRB:使用 C# 编译器编译 ASP.NET 资源时出现错误信息"编译错误信息:CS1595"
本文的发布号曾为 CHS318274
不管 Web 服务是以 Visual Basic .NET 还是 Visual C# .NET 编写的,Web 服务都使用 C# 编译器编译它们的代理。因此,即使您在使用 Visual Basic .NET 项目,也可能会收到此错误信息。
请注意,如果您在一页中合并 src 和 codebehind 属性,也会收到类似的编译器错误信息。但是,这会被认为是开发人员的错误。如果您遇到本文介绍的特定问题,该错误信息总是会指定 mscorlib.dll 程序集。
卷上的默认访问控制列表授予 Everyone 和 Users 组读取和列出文件的权限。但是,有时会删除这些权限以提供更加安全的环境。如果发生这种情况,Csc.exe 则无法调拨路径名称。由于当前 ASP.NET 未向编译器提供 选项,所以编译器包含了程序集的多个例程。使用 Visual Basic .NET 编译器 (Vbc.exe) 编译资源时不会发生此问题。
本页内容
症状 | ||
原因 | ||
解决方案 | ||
状态 | ||
更多信息 | ||
参考 |
症状
当您使用 C# 编译器 (Csc.exe) 编译 ASP.NET 资源时,可能会收到与以下某条错误信息类似的编译器错误信息:
Compiler Error Message:CS1595:'System.Collections.ArrayList' is defined in multiple places; using definition from 'c:\winnt\microsoft.net\framework\v1.0.3705\mscorlib.dll'
- 或 -
Compiler Error Message:CS1595:'System.Runtime.CompilerServices.CompilerGlobalScopeAttribute' is defined in multiple places; using definition from 'c:\windows\microsoft.net\framework\v1.0.3705\mscorlib.dll'
此问题可能会在第一次尝试运行 Visual C# .NET Web 应用程序或者运行 Microsoft Visual Basic .NET 或 Visual C# .NET Web Service 时发生。
原因
发生此问题是因为 C# 编译器无权访问 mscorlib.dll 程序集的路径中的文件夹。
解决方案
若要解决此问题,请使用下列方法之一(按优先顺序排列)。
若要在计算机上的 C# 编译器定义中包括 /nostdlib 选项,请按照下列步骤操作:
备注:compilerOptions 属性不是增量。如果您需要在 Web.config 文件中或在给定页上忽略此选项,除自定义内容之外,还必须添加 /nostdlib 选项。
备注:不能将此方法用于使用 XmlSerializer 类或 Web 服务的应用程序,因为 XmlSerializer 使用的编译器调用不继承这些选项。
备注:如果使用了 /nostdlib 选项,而且没有使用 Web 服务,则不要使用此方法。
方法 1:在 C# 编译器定义中包括 /nostdlib 选项
若要解决此问题,请将 C# 编译器的编译器定义修改为包括 /nostdlib 选项。/nostdlib 选项会禁止导入 mscorlib.dll 程序集,mscorlib.dll 定义于整个 System 名称空间。若要在计算机上的 C# 编译器定义中包括 /nostdlib 选项,请按照下列步骤操作:
1. | 打开 Machine.config 文件,然后找到 <compilers> 部分。 |
2. | 在 C# 的 <compiler> 定义中,添加 compilerOptions 属性,值为 /nostdlib。例如:
|
备注:不能将此方法用于使用 XmlSerializer 类或 Web 服务的应用程序,因为 XmlSerializer 使用的编译器调用不继承这些选项。
方法 2:为 ASPNET 帐户授予列出权限
要解决此问题,您还可以为下列帐户之一授予"列出文件夹/读取数据"权限: (我认为应该是IIS里的站点目录的权限还有一种可能是% windir %\Microsoft.NET\Framework\ 版本 这个目录,反正我把两个目录都设置了。)• | ASPNET 帐户。 |
• | 包括 ASPNET 帐户的组。 |
• | 进程标识,用于为 mscorlib.dll 程序集路径(通常为 % windir %\Microsoft.NET\Framework\ 版本)中的每个文件夹运行的 ASP.NET 辅助进程。这通常是的卷根目录(例如 C:\),帐户在此没有权限。 |
状态
这种现象是设计使然。