任何人都可以发布Microsoft开发最佳实践和指南的链接?
我为此搜索了高低,似乎无法找到我正在寻找的资源.特别是我期待微软发布的开发指南,以概述.net开发中的最佳实践...它包含关闭连接,命名约定,异常处理......
我记得当我在前一段时间定义公司SDLC并做FxCop工作和设置时,我从微软那里得到了一个很强大的.net开发,FxCop检查并执行.
有人可以帮我再次找到这个吗?!?!?
如果查看只读集合的代码,它没有"添加"方法,而是定义ICollection<T>.Add(T Value)方法(显式接口实现).
当我用我的ReadOnlyDictionary类做了类似的事情时,FxCop 10抱怨我打破了CA1033.
public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
//CA1033 ERROR
void IDictionary<TKey, TValue>.Add(TKey, TValue) { //Throw Exception }
}
public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
//NO CA1033 ERROR
Add(TKey, TValue) { //Throw Exception }
}
Run Code Online (Sandbox Code Playgroud)
ReadOnlyCollectionClass:
public class ReadOnlyCollection<T> : ICollection<T>
{
void ICollection<T>.Add(T item) { //Throw Exception }
}
Run Code Online (Sandbox Code Playgroud)
那么,这是误报吗?微软的基本代码是坏的吗?是什么赋予了?
所以我试图运行一系列在RuleSet中定义的规则.RuleSet文件实际上是使用Sonarqube生成的 - 我已经选择了绝对的所有规则,包括FxCop,ReSharper和StyleCop规则.我正在开这样的FxCop:
C:/FxCop/FxCopCmd.exe /file:C:\TestProject\bin\TestProject.dll /ruleset:=C:\TestProject\testproject.ruleset /out:C:\TestProject\fxcop-report.xml /outxsl:none /forceoutput /searchgac /aspnet
Run Code Online (Sandbox Code Playgroud)
它正确启动,但我收到以下消息:
初始化Introspection引擎...
分析...
初始化Phoenix引擎......
分析...
分析完成.
*1总分析引擎异常.
XML输出包含以下内容:
<Exception Keyword="CA0001" Kind="Engine">
<Type>Phx.FatalError</Type>
<ExceptionMessage>Exception of type 'Phx.FatalError' was thrown.</ExceptionMessage>
<StackTrace> at Phx.FatalError.Dispatch()
at Phx.Logging.Diagnostics.DiagnosticMessage.LogMessage(Severity severity, DiagnosticInfo diagnosticInfo, SourceContext sourceContext, String descriptionString)
at Phx.PE.PEUtilities.UserError(String infoMessage)
at Phx.Pdb.ReaderImplementation.Open(Boolean loadTypeOnly)
at Phx.PEModuleUnit.LoadPdb()
at Phx.PE.ReaderPhase.CheckSymbolicInformation()
at Phx.PEModuleUnit.LoadGlobalSymbols()
at Phx.PEModuleUnit.LoadEncodedIRUnitList()
at Phx.PEModuleUnit.GetEnumerableContributionUnit(ContributionUnitEnumerationKind contributionUnitEnumerationKind)
at Phx.PEModuleUnit.GetEnumerableContributionUnit()
at Microsoft.FxCop.Engines.Phoenix.PreScanPass.GetFunctionUnits(PEModuleUnit peModuleUnit)
at Microsoft.FxCop.Engines.Phoenix.PreScanPass.Execute(ModuleUnit moduleUnit)
at Phx.Passes.Pass.DoPass(ModuleUnit moduleUnit)
at Phx.Passes.PassList.DoPassList(ModuleUnit moduleUnit)
at Microsoft.FxCop.Engines.Phoenix.PhoenixAnalysisEngine.Host.ExecutePasses(PEModuleUnit peModuleUnit)
at Microsoft.FxCop.Engines.Phoenix.PhoenixAnalysisEngine.AnalyzeInternal()
at Microsoft.FxCop.Engines.Phoenix.PhoenixAnalysisEngine.Analyze()
at …Run Code Online (Sandbox Code Playgroud) 我想在FXCop中创建额外的规则.自定义规则,以帮助确保特定的最佳实践,如检查内联sql.
我真的在寻找好的资源和例子.谢谢!
必须有简单的方法,我不想在每个项目上单独运行代码分析.
我一直在使用FxCop查看我们的一些VB.NET dll,并且所有错误都与DLL设置(即强名称,文化信息)和变量方法的情况有关.
看一下FxCop检查C#Dll的几个例子,它似乎提供了更多的潜在错误.
这是否意味着FxCop对于VB.NET或我刚刚选择的不良示例的C#开发更有价值.
我认为FxCop是在处理IL而不是特定语言的情况下,所以我只是缺少VB.NET的规则文件,还是有更多可用于C#的文件?
FxCop在规则中说通用List不应该暴露给外界.
但我不明白为什么以及什么是generice List的替代品?
参考:http://msdn.microsoft.com/en-in/library/ms182142%28en-us%29.aspx
我正在尝试将FxCop直接合并到我的构建中.我正在使用MSBuild社区任务.我有一个像这样的目标文件:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FxCopToolPath Condition="'$(FxCopToolPath)' == ''">$(MetaSharpLibPath)\FxCop</FxCopToolPath>
<FxCopCustomDictionary Condition="'$(FxCopCustomDictionary)' == ''">$(FxCopTooLPath)\CustomDictionary.xml</FxCopCustomDictionary>
<MSBuildCommunityTasksLib>..\MSBuild.Community.Tasks\MSBuild.Community.Tasks.dll</MSBuildCommunityTasksLib>
</PropertyGroup>
<UsingTask AssemblyFile="$(MSBuildCommunityTasksLib)" TaskName="MSBuild.Community.Tasks.FxCop" />
<Target Name="AfterBuild" >
<ItemGroup>
<FxCopRuleAssemblies Include="DesignRules.dll" />
<FxCopRuleAssemblies Include="GlobalizationRules.dll" />
<FxCopRuleAssemblies Include="InteroperabilityRules.dll" />
<FxCopRuleAssemblies Include="MobilityRules.dll" />
<FxCopRuleAssemblies Include="NamingRules.dll" />
<FxCopRuleAssemblies Include="PerformanceRules.dll" />
<FxCopRuleAssemblies Include="PortabilityRules.dll" />
<FxCopRuleAssemblies Include="SecurityRules.dll" />
<FxCopRuleAssemblies Include="SecurityTransparencyRules.dll" />
<FxCopRuleAssemblies Include="UsageRules.dll" />
<FxCopTargetAssembly Include="@(MainAssembly)" />
</ItemGroup>
<FxCop
ToolPath="$(FxCopToolPath)"
CustomDictionary="$(FxCopCustomDictionary)"
RuleLibraries="@(FxCopRuleAssemblies)"
TargetAssemblies="@(FxCopTargetAssembly)"
DependencyDirectories="@(ReferencePath)"
FailOnError="True"
ConsoleXslFileName="$(FxCopToolPath)\Xml\VSConsoleOutput.xsl"
DirectOutputToConsole="true" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
它工作得很好,除了我添加[SuppressMessage]警告时它们仍然显示在我的输出中.我创建了一个.fxcop项目文件并包含输出程序集并尝试以这种方式运行它,但同样的事情发生了.似乎FxCop不尊重我的压抑,任何想法?
这是一个无效的抑制示例(GlobalSuppressions.cs):
[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = …Run Code Online (Sandbox Code Playgroud) 我试图将一些代码从Delphi移植到C#,我发现了一个无法以合理的方式实现的构造,同时遵守.NET Framework设计指南(我在问题的最后解决).
显然,C#,Java,C++(以及许多其他语言)提供了方法/构造函数重载的含义,但Delphi构造函数还可以有多个名称.这样就可以编写直接代表意图的代码:
var
Data, ParI, ParD, Locl: TDataElement;
begin
Data := TDataElement.Create('Element');
ParI := TDataElement.CreateParam('IntElement', 22);
ParD := TDataElement.CreateParam('DblElement', 3.14);
Locl := TDataElement.CreateLocal('LocalElement');
// ... use the above objects ...
end;
Run Code Online (Sandbox Code Playgroud)
简化代码如下:
unit DataManager;
interface
TDataElement = class
FName: string;
FPersistent: Boolean;
public
constructor Create(AName: string);
constructor CreateParam(AName: string; DefaultInt: Integer); overload;
constructor CreateParam(AName: string; DefaultDouble: Double); overload;
constructor CreateLocal(AName: string);
property Name: string read FName;;
property Persistent: Boolean read FPersistent;
end;
implementation
constructor TDataElement.Create(AName: string);
begin
FName := …Run Code Online (Sandbox Code Playgroud) 我的一个项目中的代码类似于以下代码:
internal enum ArtworkType
{
Undefined = 0,
Bmp = 1,
Gif = 2,
Jpeg = 3,
Png = 4
}
[StructLayout(LayoutKind.Sequential)]
internal struct TagArtwork
{
internal IntPtr data;
internal int size;
internal ArtworkType type;
}
Run Code Online (Sandbox Code Playgroud)
当我在这段代码上运行FxCop时,我会遇到警告CA1049.此结构用于与本机代码库的互操作性,因此它几乎必须具有此布局.为什么FxCop让我对这个结构感到悲伤?我在同一个源文件中有其他结构,也有IntPtr成员,但FxCop不抱怨这些.
例如,下面的代码并没有引发同样的警告:
internal enum ItemType
{
Implicit = 0,
Utf8 = 1,
Utf16 = 2,
Sjis = 3,
Html = 6,
Xml = 7,
Uuid = 8,
Isrc = 9,
Mi3p = 10,
Gif = 12, …Run Code Online (Sandbox Code Playgroud) fxcop ×10
c# ×5
.net ×3
vb.net ×2
asp.net ×1
constructor ×1
delphi ×1
list ×1
msbuild ×1
overloading ×1