小编Mik*_*EEE的帖子

如何从Visual Studio 2017中的.NET Framework 4.5控制台应用程序引用.NET标准库?

我终于安装了Visual Studio 2017.2并试图让我的第一个项目正常工作,但我遇到了一些麻烦,我希望在这里解决.

我有一个非常简单的.NET标准库,描述为以下项目文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard1.6</TargetFramework>
  </PropertyGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

还有一个非常简单的.NET Framework控制台应用程序,它引用了上面的.NET标准库,并被描述为以下项目文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net45</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Common\Common.csproj" />
  </ItemGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

当我构建我的控制台应用程序时,我收到以下构建错误:

C:\Program Files\dotnet\sdk\1.0.4\NuGet.targets(97,5): error : Project Common is not compatible with net45 (.NETFramework,Version=v4.5). Project Common supports: netstandard1.6 (.NETStandard,Version=v1.6)

我看到了这个问题,并尝试了那里提供的一些建议,但没有一个有效.所以,这似乎是一个不同的问题.请注意,这是在我的解决方案构建期间发生的,而不是以任何方式引用(显式)NuGet包.

最后,如果它有帮助,我有一个解决方案,在这里演示这个问题:https: //github.com/Mike-EEE/Stash/blob/master/VS2017.Multi/VS2017.dotNetFramework.sln

.net c# nuget visual-studio-2017 .net-standard

27
推荐指数
2
解决办法
2万
查看次数

有没有办法强制项目引用.NET标准项目到特定的TargetFramework

我是GitHub项目的贡献者,最近我们将.NET Standard 2.0项目正确安装到.NET Framework 4.5项目中遇到了一些麻烦.原因是(如果我理解正确的话).NET Standard 2.0支持4.6.1的最小.NET Framework.

好,可以.所以我们更新了.csproj以创建另一个框架输出:

<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)

在我们的测试项目中,支持的框架定义如下:

<TargetFrameworks>netcoreapp2.0;net471;net45</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)

但是,我们遇到了net471构建问题,因为它似乎正在采用net45框架而不是框架netstandard2.0.为了使这个工作,我们必须设置TargetFrameworks类库如下:

<TargetFrameworks>netstandard2.0;net471;net45</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)

这似乎是过度的,因为它似乎.netstandard2.0应该是TargetFramework那个net471,而不是net45目标.

有没有办法强制项目引用特定的TargetFramework?我在测试项目中尝试了以下内容,但似乎没有用:

<ItemGroup Condition="'$(TargetFramework)' != 'net471'">
  <ProjectReference Include="..\..\src\ExtendedXmlSerializer\ExtendedXmlSerializer.csproj" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net471'">
  <ProjectReference Include="..\..\src\ExtendedXmlSerializer\ExtendedXmlSerializer.csproj">
    <TargetFramework>netstandard2.0</TargetFramework>
  </ProjectReference>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

提前感谢您提供的任何帮助!

.net msbuild .net-core .net-standard

13
推荐指数
2
解决办法
2392
查看次数

如何从 Asp.NET Core 3.1 Startup 类访问 launchSettings.json 中的 `applicationUrl` 属性?

我目前正在创建一个 Asp.NET Core 3.1 API 应用程序。在其中,我有一个launchSettings.json如下所示:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:61392",
      "sslPort": 44308
    }
  },
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "environmentVariables": {
        "Key": "Value",
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Application.API": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "https://localhost:5001;http://localhost:5000"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

特别是,我对获取applicationUrl此文件中定义的值很感兴趣。不幸的是,除了通过 JSON 序列化直接加载文件并探测那里的值之外,我没有看到任何明显的方法来访问它们。

因此,我正在寻找更优雅的解决方案。有没有办法从Startup.Configure和/或Startup.ConfigureServices方法中访问这些值?

我在想类似的事情:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true, …
Run Code Online (Sandbox Code Playgroud)

c# environment configuration json asp.net-core

9
推荐指数
2
解决办法
7488
查看次数

是否对通用原因拳击执行空检查?

我四处寻找,但找不到答案.说我有这个代码:

class Command<T> : ICommand<T>
{
    public void Execute(T parameter)
    {
        var isNull = parameter == null;
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

T可以是任何阶级,甚至是Nullable<>.如果T是值类型,执行上面的检查会导致装箱吗?我的理解是,这与调用ReferenceEquals两个object参数相同T,如果我理解正确的话,其中任何一个都会导致拳击,如果是值类型.

如果以上确实导致拳击,是否有更优选的方法来做到这一点而不会导致框发生?我知道有,default(T)但在int那种情况下0,我正在寻找这个值是否null没有拳击它.另外,我希望以满足值和引用类型的方式执行此操作.

.net c# boxing

7
推荐指数
1
解决办法
478
查看次数

为什么编译的委托比声明的委托更快?

首先,这与为什么从表达式>> Func <>创建的Func <>不一样直接声明?令人惊讶的恰恰相反.另外,我在研究这个问题时发现的所有链接和问题都源自2010 - 2012年的时间段,所以我决定在这里打开一个新问题,看看是否有关于当前代表状态的讨论.NET生态系统中的行为.

也就是说,我正在使用.NET Core 2.0和.NET 4.7.1,并且我看到了一些奇怪的性能指标,这些指标是从编译表达式创建的委托与被描述和声明为CLR对象的委托相关的.

关于我如何偶然发现这个问题的一些背景,我正在做一个测试,涉及1,000和10,000个对象的数组中的数据选择,并注意到如果我使用编译表达式,它会获得更快的结果.我设法把它归结为一个非常简单的项目,可以重现这个问题,你可以在这里找到:

https://github.com/Mike-EEE/StackOverflow.Performance.Delegates

对于测试,我使用了两组基准测试,其特点是与已声明的委托配对的已编译委托,从而产生四个总核心基准.

第一个委托集由一个返回空字符串的空委托组成.第二个集合是一个委托,其中包含一个简单的表达式.我想证明这个问题出现在最简单的委托以及具有已定义主体的委托中.

然后,这些测试通过优秀的Benchmark.NET 性能产品在CLR运行时和.NET Core运行时上运行,从而产生8个总基准.此外,我还利用了同样出色的Benchmark.NET 反汇编诊断程序来发出基准测量的JIT期间遇到的反汇编.我将分享以下结果.

以下是运行基准测试的代码.你可以看到它非常简单:

[CoreJob, ClrJob, DisassemblyDiagnoser(true, printSource: true)]
public class Delegates
{
    readonly DelegatePair<string, string> _empty;
    readonly DelegatePair<string, int>    _expression;
    readonly string                       _message;

    public Delegates() : this(new DelegatePair<string, string>(_ => default, _ => default),
                              new DelegatePair<string, int>(x => x.Length, x => x.Length)) {}

    public Delegates(DelegatePair<string, string> empty, DelegatePair<string, int> expression,
                     string message = "Hello World!")
    {
        _empty      = …
Run Code Online (Sandbox Code Playgroud)

.net c# performance delegates linq-expressions

7
推荐指数
1
解决办法
261
查看次数

是否激活结构而不将其存储为局部变量期望比将其存储为局部变量更慢?

我在.NET Core 2.1中遇到了一个我想要了解的性能问题.可以在此处找到此代码:

https://github.com/mike-eee/StructureActivation

以下是BenchmarkDotNet的相关基准代码:

public class Program
{
    static void Main()
    {
        BenchmarkRunner.Run<Program>();
    }

    [Benchmark(Baseline = true)]
    public uint? Activated() => new Structure(100).SomeValue;

    [Benchmark]
    public uint? ActivatedAssignment()
    {
        var selection = new Structure(100);
        return selection.SomeValue;
    }
}

public readonly struct Structure
{
    public Structure(uint? someValue) => SomeValue = someValue;

    public uint? SomeValue { get; }
}
Run Code Online (Sandbox Code Playgroud)

从一开始,我希望Activated更快,因为它没有存储在本地变量,这是我一直理解为对性能产生负面定位和当前栈框架内预留的空间这样做.

但是,在运行测试时,我得到以下结果:

// * Summary *

BenchmarkDotNet=v0.11.1, OS=Windows 10.0.17134.285 (1803/April2018Update/Redstone4)
Intel Core i7-4820K CPU 3.70GHz (Haswell), 1 …
Run Code Online (Sandbox Code Playgroud)

c# performance .net-core benchmarkdotnet c#-7.2

7
推荐指数
1
解决办法
123
查看次数

ASP.NET WebHooks和Web服务之间的区别?

我一直在关注Henrik F Nielsen关于新的ASP.NET WebHooks技术的一系列令人印象深刻的博客文章. 如果有兴趣,可以在这里找到最新的帖子.

在另一篇早期的其中一篇文章中,我在评论中询问了WebHooks和SignalR之间的区别.后来在StackOverflow上将答案发布到了一个很好的问题(和答案)的链接.

但是,现在在阅读了该问题的答案后,我现在要问:使用ASP.NET WebHooks和使用常规的OL'Web服务有什么区别?SignalR比较答案中给出的接受答案表明"思考B2B通信".但是,当我想到B2B通信时,我立即想到了Web服务 - SOAP或REST(正如我在这一点上所理解的那样 - 使用HTTP动词,就像WebHooks一样).

我一直对学习WebHooks很感兴趣,并且一直关注这些帖子,但是所有这些都是如何融合在一起的困惑仍然存在,特别是当其他技术似乎基本上做同样的事情时.在两种技术之间进行澄清会很棒.

.net c# asp.net web-services webhooks

6
推荐指数
1
解决办法
1692
查看次数

在NuGet包中安装T4模板会产生编译错误

我正在创建一个包含T4模板的NuGet包.安装我的NuGet包后,T4模板立即执行,因为它们用"TextTemplatingFileGenerator"作为默认的自定义工具进行修饰.

用户Subgurim在NuGet安装过程中删除自定义工具有一个完美的解决方案: NuGet - T4文件属性在安装后有所不同

这确实从我的NuGet包的.TT文件中删除了自定义工具属性.但是,此时,它们已经执行,并且我的错误列表中充满了这些文件执行失败的错误.

有没有办法在成功安装我的NuGet包之后清除错误列表和/或在安装期间阻止Visual Studio运行T4模板,以便不列出这些错误?

t4 envdte nuget visual-studio-2013

5
推荐指数
0
解决办法
338
查看次数

在AutoFixture中注入接口和实现

考虑以下类:

public interface IInterface {}
public class Class : IInterface {}

public class Customization : ICustomization
{
    readonly IInterface item;

    public Customization() : this( new Class() ) {}

    public Customization( IInterface item )
    {
        this.item = item;
    }

    public void Customize( IFixture fixture )
    {
        fixture.Inject( item );
        var created = fixture.Create<Class>(); // Would like this to resolve as item from previous line.
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题IInterface是注入,而Class不是.有没有办法注入两者IInterface,Class以便为两者返回相同的实例?

请注意,我想使用ICustomization(或在一个内ICustomization)而不是测试方法的属性.我希望在这两个类上进行自定义注入.如果我[Frozen( …

c# unit-testing autofixture

5
推荐指数
3
解决办法
1305
查看次数

ConstructorInfo.GetParameters线程安全吗?

这是一个非常奇怪的问题,我花了一天时间试图追踪.我不确定这是否是一个错误,但是对于为什么会发生这种情况获得一些观点和想法会很棒.

我正在使用xUnit(2.0)来运行我的单元测试.xUnit的优点在于它可以自动为您并行运行测试.但是,我发现的问题是,Constructor.GetParametersConstructorInfo标记为线程安全类型时,似乎不是线程安全的.也就是说,如果两个线程同时到达Constructor.GetParameters,则会产生两个结果,并且对此方法的后续调用将返回已创建的第二个结果(无论调用它的线程如何).

我已经创建了一些代码来演示这种意外行为(如果你想在本地下载并试用该项目,我也将它托管在GitHub上).

这是代码:

public class OneClass
{
    readonly ITestOutputHelper output;

    public OneClass( ITestOutputHelper output )
    {
        this.output = output;
    }

    [Fact]
    public void OutputHashCode()
    {
        Support.Add( typeof(SampleObject).GetTypeInfo() );
        output.WriteLine( "Initialized:" );
        Support.Output( output );

        Support.Add( typeof(SampleObject).GetTypeInfo() );
        output.WriteLine( "After Initialized:" );
        Support.Output( output );
    }
}

public class AnotherClass
{
    readonly ITestOutputHelper output;

    public AnotherClass( ITestOutputHelper output )
    {
        this.output = output;
    }

    [Fact]
    public void OutputHashCode()
    {
        Support.Add( typeof(SampleObject).GetTypeInfo() ); …
Run Code Online (Sandbox Code Playgroud)

.net c# xunit.net task-parallel-library xunit2

5
推荐指数
1
解决办法
394
查看次数