小编Bog*_*gey的帖子

Roslyn如何与MsBuild相关?

我想知道:Roslyn究竟与MsBuild有什么关系?

我的理解是这样的

  1. Roslyn是一个编译引擎
  2. MsBuild主要是一组如何设置项目的规范 - 即基本上是.csproj,.sln文件等的定义模式.

然后,MsBuild还附带了一个msbuild.exe - 如果我错了,请纠正我,能够实际编译项目.但是,假设msbuild.exe可以编译项目,那么如何与Roslyn相提并论呢,但Roslyn也是如此?

在MSBuild 15的情况下,msbuild.exe是否使用Roslyn进行编译?它们是完全分开的吗?我误会了什么吗?

而且更具体地说:假设我想以编程方式创建简单的.csproj文件,并使用Roslyn的MSBuildWorkspace来处理/填充并最终编译这些文件.我的应用程序的最终用户是否需要在其计算机上安装Microsoft的构建工具?或者这不是必需的,因为Roslyn能够独立于任何本地MSBuild安装来读取和编译这些内容吗?

c# msbuild roslyn

16
推荐指数
1
解决办法
3778
查看次数

将.NetStandard 2.0 Nuget软件包安装到VS2015 Net 4.6.1项目中

我正在尝试在Visual Studio 2015中安装一个将.NetStandard 2.0(Microsoft.Extensions.Logging.Abstractions)作为Net 4.6.1项目的Nuget软件包.但是,虽然Frameworks应该兼容,但它不能正常工作:

Install-Package : Could not install package 'Microsoft.Extensions.Logging.Abstractions 2.0.0'. You are trying to 
install this package into a project that targets '.NETFramework,Version=v4.6.1', but the package does not contain 
any assembly references or content files that are compatible with that framework. For more information, contact 
the package author.
At line:1 char:1
+ Install-Package Microsoft.Extensions.Logging.Abstractions
Run Code Online (Sandbox Code Playgroud)

我遵循了此处概述的步骤:.NET 4.6.1上的Entity Framework Core 2.0

所以我已经安装了包"NETStandard.Library.NETFramework",并添加了

<PropertyGroup>
  <PackageTargetFallback>netstandard2.0</PackageTargetFallback>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

到csproj.但是,那里没有运气 - 仍然是同样的问题.

有没有办法在我的项目中安装NetStandard 2.0软件包(没有升级VS或安装任何Net Core目标包等)?

谢谢

c# visual-studio nuget .net-standard

12
推荐指数
2
解决办法
8621
查看次数

VS Code / OmniSharp - 如何显式设置 dotnet SDK / CLI 工具的路径

我正在使用 Visual Studio 代码。在我的计算机上,我有两个单独安装的 Net Core SDK/dotnet CLI 工具

  • 标准路径中的过时版本 (netcore 1.1)%ProgramFiles%\dotnet
  • 安装到不同的自定义路径的最新版本(netcore 2.0)%AppData%\...

我需要 Visual Studio Core - 以及 Omnisharp - 才能使用最新的(即自定义安装)。不幸的是,由于我的机器设置,默认的“dotnet”命令是在过时的安装中注册的,我无法更改它。Omnisharp 也在同一位置使用 SDK。

  1. 有没有办法让非管理员用户在 Visual Studio Code / Omnisharp 中指定从我的自定义位置使用 dotnet 工具?
  2. 有什么特定的配置设置或类似的吗?

对于上下文,至于为什么我的机器有如此奇怪的设置以及为什么我对此无能为力,请参阅Cmd 优先级:如何在安装在 2 个位置时使用正确的 dotnet.exe?

谢谢

c# omnisharp .net-core visual-studio-code

12
推荐指数
1
解决办法
3万
查看次数

Generic[T] 基类 - 如何从实例中获取 T 的类型?

假设您有一个继承自 Generic[T] 的 Python 类。有没有办法获得从类/实例中传入的实际类型?

例如,

from typing import TypeVar, Type
T = TypeVar('T')

class Test(Generic[T]):
    def hello(self):
      my_type = T  # this is wrong!
      print( "I am {0}".format(my_type) )

Test[int]().hello() # should print "I am int"
Run Code Online (Sandbox Code Playgroud)

这里,建议类型 arg 出现在类型的 args 字段中。而且确实,

print( str( Test[int].__args__ ) )
Run Code Online (Sandbox Code Playgroud)

将打印 (<class 'int'>,)。但是,我似乎无法直接从实例中访问它,例如替换

      my_type = self.__class__.__args__ # this is also wrong (None)
Run Code Online (Sandbox Code Playgroud)

似乎没有诀窍。

谢谢

python generics python-3.x

10
推荐指数
4
解决办法
1874
查看次数

创建具有可能为空的泛型键类型的字典

我正在编写一个通用方法,需要在内部使用Dictionary由通用参数键控的通用方法。

我不想对通用参数本身施加任何约束,特别是没有notnull约束。但是,该方法能够显式处理空值,当然不会向它使用的字典添加任何空键。

这样做有什么最佳实践吗?

默认情况下,编译器会警告通用键类型与 的notnull约束不匹配Dictionary<,>

请参阅下面的示例。除非我遗漏了什么,否则这应该是绝对安全的。但我怎样才能最好地将这一点传达给编译器呢?除了在这里抑制编译器警告之外,还有其他方法吗?

public static int CountMostFrequentItemOrItems<T>(params T[] values)
{
    var counts = new Dictionary<T, int>();  // The type 'T' cannot be used as type parameter 'TKey' in the generic type or method 'Dictionary<TKey, TValue>'
    var nullCount = 0;
    
    foreach(var value in values)
        if (value is null)
            ++nullCount;
        else if (counts.TryGetValue(value, out var count))
            counts[value] = count+1;
        else
            counts[value] = 1;

    // ... combine results etc ...
}
Run Code Online (Sandbox Code Playgroud)

c# dictionary nullable nullable-reference-types

9
推荐指数
0
解决办法
281
查看次数

实体框架6:使用界面作为导航属性可能吗?

有没有办法在EF6中使用接口作为导航属性?我找到了EF4或更早版本的相关主题,似乎不太可能; 一般来说,从那时起,继承似乎已经有了很大的改进,但我还没有找到办法使这个特定问题发挥作用.

例:

public interface IPerson
{
  string name { get; set; }
}

public class Man : IPerson { /* ... */ }
public class Woman : IPerson { /* ... */ }

public interface ICar
{
  IPerson driver { get; set; }
}

public class Car : ICar
{
  public virtual IPerson driver { get; set; }  // This won't map
}
Run Code Online (Sandbox Code Playgroud)

这有可能吗?如果没有,那么做什么是明智的方法呢?

因为目前我没有看到任何方式让接口有一个可设置的属性,其类型是其他接口(例如ICar的IPerson属性),哪种打击我作为一个非常严重的设计限制?!

c# entity-framework

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

HLSL:SV_Position,为什么/如何从float3到float4?

我刚刚开始学习着色器/ hlsl等,所以请原谅这个可能很愚蠢的问题.

我正在关注微软的DirectX教程(教程(链接),代码(链接)).据我所知,他们将POSITION定义为浮点值的3元素数组:

// Define the input layout 
    D3D11_INPUT_ELEMENT_DESC layout[] = 
    { 
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
        { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    }; 
Run Code Online (Sandbox Code Playgroud)

理所当然,每个顶点位置都有3个浮点值:x,y和z.但现在在查看Vertex着色器时,位置突然出现float4类型,而不是float3:

//--------------------------------------------------------------------------------------
// Vertex Shader
//--------------------------------------------------------------------------------------
VS_OUTPUT VS( float4 Pos : POSITION, float4 Color : COLOR )
{
    VS_OUTPUT output = (VS_OUTPUT)0;
    output.Pos = mul( Pos, World );
    output.Pos = mul( output.Pos, View );
    output.Pos = mul( output.Pos, Projection );
    output.Color = Color;
    return output; …
Run Code Online (Sandbox Code Playgroud)

c++ directx hlsl

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

如何在IConfiguration中添加自定义JSON文件?

我正在使用asp.net + Autofac.

我正在尝试加载自定义JSON配置文件,并根据它创建/实例IConfiguration实例,或者至少将我的文件包含到默认情况下的任何IConfiguration asp.net构建中.

我的问题是asp.net似乎覆盖了IConfiguration的依赖注册.

我似乎无法注册我自己的IConfiguration对象 - DI容器将始终将其解析为一些似乎由asp.net库本身生成的实例.

而且我不确定如何让asp.net至少加载我的自定义配置文件 - 即如果有任何方法可以获得它所使用的ConfigurationBuilder,并在构建IConfiguration之前添加我自己的文件宾语.

我尝试过以下方法:

public class Startup
{
    public IConfigurationRoot Configuration { get; }

    public Startup(IHostingEnvironment env)
    {
        this.Configuration = new ConfigurationBuilder()
            .SetBasePath(path)
            .AddJsonFile("somefile.json")
            .Build();
    }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services
          .AddMvc()
          .AddControllersAsServices();

         var builder = new ContainerBuilder();
         builder.Register(x => this.Configuration).As<IConfiguration>();
         builder.Populate(services);

         var container = builder.Build();

         // This will return another IConfiguration instance then the one I registered; 
         // namely One that contains 1 provider, a …
Run Code Online (Sandbox Code Playgroud)

c# autofac asp.net-core

6
推荐指数
4
解决办法
6013
查看次数

GC 压力 - 列表与数组、类与结构

假设您需要存储一定量的数据,这些数据由结构或类表示。您最多只能存储 N 个元素,如果添加更多元素,则必须先删除现有元素。

您可以使用任何您喜欢的方式来存储数据 - 列表、数组(或者您愿意的任何其他方式)。

就垃圾收集而言 - 使用类还是结构来表示信息有什么区别吗?将其存储在列表或数组中有什么区别吗?

我的直觉是最好的方法是使用结构数组,因为原则上 GC 不需要在这里收集任何东西(当数组存储在堆上时,它的大小保持不变,因此不会发生收集)相信?)。

我不完全确定如何表示结构列表 - 是否存在与添加/删除结构元素相关的任何形式的垃圾收集?

至于使用类而不是结构体,我希望一旦从列表中删除或在数组中覆盖,旧的引用将需要被收集,因此两者都会增加 GC 压力。

如果我的直觉在这里是正确的或者如果我在任何地方出错了,我将不胜感激!谢谢

示例代码:

public struct SStruct
{
   int ABC;
}

public class SClass
{
  int ABC;
}

public class Test
{
   List<SStruct> _data1;
   List<SClass> _data2;
   SStruct[100] _data3;
   SClass[100] _data4;

  public void run()
  {
    var sStruct = new SStruct();
    var sClass = new SClass();

    if(data1.Count > 0)
      _data1.RemoveAt(0);

    if(data2.Count > 0)
      _data2.RemoveAt(0);

    _data1.Add(sStruct);
    _data2.Add(sClass);
    _data3[0] = sStruct;
    _data4[0] = sClass;
}
Run Code Online (Sandbox Code Playgroud)

c#

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

COM 对象如何在应用程序域之间编组?

出于好奇 - 我一直想知道,C#中的COM对象是如何跨应用程序域编组的?

据我了解,它们不能通过引用编组(不是从 MarshalByRefObject 派生的)。我怀疑它们是可序列化的,所以也不是按值 - 这只会通过流血离开。这就是正在发生的事情吗?或者还有其他工作吗?

我在任何地方都没有找到相关信息。我基本上只是通过反复试验看到,通过这些只是......工作。但我不知道为什么/如何,以及是否适用于任何 COM 对象。

在沿应用程序域传递这些时,是否有任何特别的陷阱 - 例如,是否需要在使用它们的每个域上明确发布它们?

.net c# com

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