我想知道:Roslyn究竟与MsBuild有什么关系?
我的理解是这样的
然后,MsBuild还附带了一个msbuild.exe - 如果我错了,请纠正我,能够实际编译项目.但是,假设msbuild.exe可以编译项目,那么如何与Roslyn相提并论呢,但Roslyn也是如此?
在MSBuild 15的情况下,msbuild.exe是否使用Roslyn进行编译?它们是完全分开的吗?我误会了什么吗?
而且更具体地说:假设我想以编程方式创建简单的.csproj文件,并使用Roslyn的MSBuildWorkspace来处理/填充并最终编译这些文件.我的应用程序的最终用户是否需要在其计算机上安装Microsoft的构建工具?或者这不是必需的,因为Roslyn能够独立于任何本地MSBuild安装来读取和编译这些内容吗?
我正在尝试在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目标包等)?
谢谢
我正在使用 Visual Studio 代码。在我的计算机上,我有两个单独安装的 Net Core SDK/dotnet CLI 工具
%ProgramFiles%\dotnet
和%AppData%\...
我需要 Visual Studio Core - 以及 Omnisharp - 才能使用最新的(即自定义安装)。不幸的是,由于我的机器设置,默认的“dotnet”命令是在过时的安装中注册的,我无法更改它。Omnisharp 也在同一位置使用 SDK。
对于上下文,至于为什么我的机器有如此奇怪的设置以及为什么我对此无能为力,请参阅Cmd 优先级:如何在安装在 2 个位置时使用正确的 dotnet.exe?
谢谢
假设您有一个继承自 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)
似乎没有诀窍。
谢谢
我正在编写一个通用方法,需要在内部使用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) 有没有办法在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属性),哪种打击我作为一个非常严重的设计限制?!
我刚刚开始学习着色器/ 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) 我正在使用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) 假设您需要存储一定量的数据,这些数据由结构或类表示。您最多只能存储 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)