“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 程序集的路径中的文件夹。

解决方案

若要解决此问题,请使用下列方法之一(按优先顺序排列)。

方法 1:在 C# 编译器定义中包括 /nostdlib 选项

若要解决此问题,请将 C# 编译器的编译器定义修改为包括 /nostdlib 选项。/nostdlib 选项会禁止导入 mscorlib.dll 程序集,mscorlib.dll 定义于整个 System 名称空间。

若要在计算机上的 C# 编译器定义中包括 /nostdlib 选项,请按照下列步骤操作:
1. 打开 Machine.config 文件,然后找到 <compilers> 部分。
2. 在 C# 的 <compiler> 定义中,添加 compilerOptions 属性,值为 /nostdlib。例如:
<compiler language="c#;cs;csharp"
extension=".cs"
type="Microsoft.CSharp.CSharpCodeProvider, System,
Version=1.0.3300.0,
Culture=neutral,
PublicKeyToken=b77a5c561934e089"
warningLevel="1"
compilerOptions="/nostdlib" />
备注compilerOptions 属性不是增量。如果您需要在 Web.config 文件中或在给定页上忽略此选项,除自定义内容之外,还必须添加 /nostdlib 选项。

备注:不能将此方法用于使用 XmlSerializer 类或 Web 服务的应用程序,因为 XmlSerializer 使用的编译器调用不继承这些选项。

方法 2:为 ASPNET 帐户授予列出权限

要解决此问题,您还可以为下列帐户之一授予"列出文件夹/读取数据"权限: (我认为应该是IIS里的站点目录的权限还有一种可能是% windir %\Microsoft.NET\Framework\ 版本 这个目录,反正我把两个目录都设置了。
ASPNET 帐户。
包括 ASPNET 帐户的组。
进程标识,用于为 mscorlib.dll 程序集路径(通常为 % windir %\Microsoft.NET\Framework\ 版本)中的每个文件夹运行的 ASP.NET 辅助进程。这通常是的卷根目录(例如 C:\),帐户在此没有权限。
备注:如果使用了 /nostdlib 选项,而且没有使用 Web 服务,则不要使用此方法。

状态

这种现象是设计使然。
posted @ 2004-11-30 16:00  小草  阅读(9241)  评论(6编辑  收藏  举报
Google+