小编Jay*_*Jay的帖子

(C#7.2)"私有保护"修饰符的用例是什么?

C#7.2引入了private protected modifier.

我总是保护对具有属性的字段的访问,允许通过Get/Set方法进行访问,因为我通常不希望我的对象的内部状态被我自己的类以外的任何东西修改.

我试图理解为什么C#语言团队添加了这个功能.经过广泛搜索谷歌,阅读和观看"什么是新的"媒体(我看过Mads Torgerson的新闻稿,详细信息视频),我仍然没有更聪明.

对我来说,这似乎允许开发人员打破Liskov替换原则,但这可能是因为我不明白为什么现在存在此功能.

我理解它是如何使用的,而不是为什么 - 请有人提供一个真实的使用示例而不是MSDN文档中的人为例子吗?

.net c# access-modifiers c#-7.2

63
推荐指数
3
解决办法
4504
查看次数

设置.NET Core项目的版本号 - CSPROJ - 而不是JSON项目

此问题与设置.NET Core项目的版本号非常相似,但不相同.在编写(1.1)和VS2017时,使用最新的稳定版.NET Core,.NET Core已从基于JSON的项目文件切换到CSPROJ文件.

所以 - 我想要做的是建立一个CI环境,我希望能够在构建之前修改某些内容,以使用正确的版本号标记我的构建.

如果我使用这样的属性旧(SharedAssemblyInfo.cs技巧):

[assembly: AssemblyFileVersion("3.3.3.3")]
[assembly: AssemblyVersion("4.4.4.4")]
Run Code Online (Sandbox Code Playgroud)

某处项目时,我得到的
CS0579 - Duplicate 'System.Reflection.AssemblyFileVersionAttribute'

CS0579 - Duplicate 'System.Reflection.AssemblyVersionAttribute'
错误的时候建设.

在深入挖掘它时,我发现在构建过程中有一个看起来像这样的文件(在构建之前它不存在)\obj\Debug\netcoreapp1.1:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Reflection;

[assembly: System.Reflection.AssemblyCompanyAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyDescriptionAttribute("Package Description")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.99.0")] …
Run Code Online (Sandbox Code Playgroud)

versioning continuous-integration .net-core asp.net-core

48
推荐指数
7
解决办法
3万
查看次数

如何将bash中的星号字符'*'作为我的C程序的参数传递?

假设我有一个C程序,我从bash运行它:

$ ./a.out 123 *
Run Code Online (Sandbox Code Playgroud)

该程序将输出所有命令行参数,但它将显示以下内容:

Argument 1: 123
Argument 2: a.out

我可以在我的程序中做些什么来解决这个问题?

bash escaping

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

尝试将重复项添加到集合时应该抛出什么异常类型?

以下代码应抛出异常以防止添加重复的集合项.

ICollection<T> collection = new List<T>();

public void Add(T item)
{
    if (collection.Contain(item))
    {
          throw new SomeExceptionType()
    }

    collection.Add(item);
}
Run Code Online (Sandbox Code Playgroud)

什么标准异常类型最合适?

.net c# exception duplicates

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

dotnet pack项目参考

我非常喜欢在几个程序集之间分离功能,例如,外观到数据提供程序,数据提供程序的合同以及数据提供程序实现本身......在我看来,它可以轻松地对单个组件进行单元测试功能和将来很容易换掉一件事(在我的例子中,它使数据提供者易于更换).

如果我创建一个包含3个项目并使用项目引用的解决方案,那么当我在入口程序集上构建dotnet时,所有引用都将复制到输出文件夹中.当我通过dotnet打包条目汇编项目来创建NuGET包时,NuGET包中只包含条目组件(而不是契约或数据提供者)

这似乎是设计上的; .NET Core dotnet-pack 的文档说明了这一点

项目到项目的引用不会打包在项目中.目前,如果您具有项目到项目的依赖关系,则每个项目必须有一个包.

我的问题是 - 为什么会这样?如果我想将我的代码分成逻辑程序集,我不得不创建单独的NuGET包并引用它们,或者只是将我的所有代码都集成到一个程序集中.有没有办法在NuGET包中包含项目引用?

我正在使用VS2017/.NET Core v1.1(csproj,而不是xproj)

c# project-reference nuget-package .net-core

18
推荐指数
1
解决办法
3381
查看次数

在VS 2019中重新启用标题栏(预览)

我已下载Visual Studio 2019的预览版,默认情况下禁用标题栏.

这对我不起作用,因为我目前正在使用多个visual studio实例开发C#应用程序,我喜欢知道哪个窗口与哪个解决方案有关,以及我是否使用提升的权限运行.

我发现我可以通过转到选项中的"预览功能"部分来重新启用标题栏,但这显然不会出现在Visual Studio 2019的真实版本中.

我在网上搜索过,但只发现功能请求不删除标题栏.

目前有没有办法在VS 2019中重新启用标题栏(与预览功能选项无关)?

.net c# visual-studio visual-studio-2019

17
推荐指数
3
解决办法
2711
查看次数

确保调用以结束一系列方法

注意/免责声明:经过几次搜索后,我在本帖中看到的最接近的内容是关于SO的帖子(方法链接和整理问题),这与我的问题相似,但并没有真正回答 - 但无论如何,我希望这不是一个重复的问题.

我在做什么:

我已经在一个方法调用的现有日志框架上创建了一个流畅的接口作为一个外观 - 所以我的语法看起来有点像这样:

Logger.Debug().Message("Debug message!").WriteToLog();
Logger.Error().Message("An exception occured").Exception(ex).WriteToLog();
Run Code Online (Sandbox Code Playgroud)

我将一个内部对象从一个方法调用传递给下一个对象,以便在最后调用时(WriteToLog方法); 消息被写入某个日志文件.

我觉得有点闻

为了验证(仅当应用程序是在调试模式下构建的时候),我在上下文类(只是属性包对象)上有一个属性,它从方法调用传递给返回的对象,直到链终止; 它是一个布尔值,默认为false.

使用Debug.Assert在上下文类析构函数中评估此属性,以确定是否调用结束链的最终方法,以便在开发期间捕获任何日志记录错误.(属性,设置属性的代码和析构函数本身都是在#if DEBUG预处理器指令的上下文中创建的,所以如果它是在发行版中构建的,或者如果符号不存在,则代码不会得到编译.)

知道在c#2.0及更高版本中使用析构函数是不好的,并且我可能无法访问属性,因为我相信对终结顺序没有任何保证.这就是为什么它只在内置调试模式时发生,以及为什么我想摆脱它.

我试图建立一个断言的原因是因为它很容易忘记并最终编写代码

Logger.Debug().Message("Debug message!");
Run Code Online (Sandbox Code Playgroud)

这意味着没有任何东西被记录下来,虽然粗略地看了一眼就好了.

我的问题

我想知道的是 - 有人能想到另一种验证最终方法总是被调用的方法吗?在开发过程中只需要这些消息,以向开发人员强调方法链尚未完成 - 我不希望最终用户找到与登录最终产品相关的错误消息.

.net c# fluent-interface

11
推荐指数
1
解决办法
1092
查看次数

控制docker中托管的.NET Core控制台应用程序的生命周期

免责声明 - 这与Docker容器即使在.net核心控制台应用程序中使用Console.ReadLine()立即退出几乎是同一个问题- 但我不认为这个问题的接受答案是令人满意的.

我想要实现的目标
我正在构建一个控制台应用程序(它是一个使用ServiceStack的HTTP服务),它是用.NET内核构建的(dnxcore50 - 这是一个控制台应用程序,而不是ASP.NET应用程序).我在Linux机器上的docker容器中运行此应用程序.我已经完成了,HTTP服务正常工作.

我的问题
说过"我的服务有效" - 确实如此,在docker容器中托管服务存在问题.我Console.ReadLine()在启动HTTP侦听器后使用,但此代码不会在docker容器中阻塞,并且容器将在启动后立即退出.我可以在"交互"模式下启动docker容器,服务将在那里监听,直到我终止交互式会话,然后容器将退出.

Repo
代码下面的代码是用于创建测试.NET核心服务堆栈控制台应用程序的完整代码清单.

public class Program
{
    public static void Main(string[] args)
    {
        new AppHost().Init().Start("http://*:8088/");
        Console.WriteLine("listening on port 8088");
        Console.ReadLine();

    }
}

public class AppHost : AppSelfHostBase
{
    // Initializes your AppHost Instance, with the Service Name and assembly containing the Services
    public AppHost() : base("My Test Service", typeof(MyTestService).GetAssembly()) { }

    // Configure your AppHost with the necessary configuration and dependencies your App needs
    public …
Run Code Online (Sandbox Code Playgroud)

c# linux servicestack docker .net-core

11
推荐指数
1
解决办法
5394
查看次数

扩展IdentityServer4服务

我已经关注了IdentityServer4快速入门,并且能够使用隐式授权使用IdentityServer的本地主机实例来验证我的javascript网页(几乎与快速入门中提供的相同).同样,我的IdentityServer几乎与上面提到的快速入门中提供的相同 - 它只是有一些自定义用户详细信息.

然后我将我的应用程序(C#.NET Core)移动到一个docker容器中,并在Kubernetes集群(单个实例)中托管了一个这样的实例,并创建了一个Kubernetes服务(通过一个或多个"真实"服务的外观),这使我可以访问集群外部的身份服务器.我可以修改我的JavaScript网页并将其指向我的Kubernetes服务,它仍然可以很愉快地显示登录页面,它似乎按预期工作.

然后当我将IdentityServer扩展到三个实例(所有服务都在一个Kubernetes服务后面)时,我开始遇到问题.Kubernetes服务对每个身份服务器进行循环请求,因此第一个将显示登录页面,但第二个将在我按下登录按钮后尝试处理身份验证.这会导致以下错误:

System.InvalidOperationException:无法解密防伪令牌.---> System.Security.Cryptography.CryptographicException:在密钥环中找不到密钥{19742e88-9dc6-44a0-9e89-e7b09db83329}.at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtction.UnprotectCore(Byte [] protectedData,Boolean allowOperationsOnRevokedKeys,UnprotectStatus&status)at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte [] protectedData,Boolean ignoreRevocationErrors,Boolean&requiresMigration,Boolean&wasRevoked )Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtction.Unprotect(Byte [] protectedData)at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)---内部异常堆栈跟踪结束--- ...还有更多......

所以 - 我明白我收到了这个错误,因为期望是同一个IdentityServer应该为它所显示的页面提供服务请求(否则反伪造令牌会如何工作,对吧?),但是我想要的是了解我是如何在复制环境中完成这项工作的.

我不想在不同的IP /端口上托管多个身份服务器; 我正在尝试构建一个HA配置,如果一个IdentityServer死掉,那么调用端点的任何东西都不应该关心(因为请求应由其他工作实例提供服务).

我说我正在使用快速入门代码 - 这意味着在IdentityServer的启动时,有一些看起来像这样的代码......

    public void ConfigureServices(IServiceCollection services)  
    {
        services.AddMvc();

        services.AddIdentityServer(options =>
            {
                options.Events.RaiseSuccessEvents = true;
                options.Events.RaiseFailureEvents = true;
                options.Events.RaiseErrorEvents = true;
            })
            .AddTemporarySigningCredential()
            .AddInMemoryIdentityResources(Config.GetIdentityResources())
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryClients(Config.GetClients())
Run Code Online (Sandbox Code Playgroud)

我假设我需要.AddTemporarySigningCredential()用可以由我的Kubernetes集群中运行的IdentityServer的所有实例使用的证书替换逻辑.不知道MVC是如何工作的(MVC6用于生成IdentityServer服务中的登录页面,我从示例代码中获取 - 上面的链接) - 我想知道是否只是更改代码以使用在之间共享的适当证书所有服务都足以让HA IdentityServer集群工作原型?

通过工作,我的意思是我的期望是我可以在Kubernetes集群中运行n个IdentityServer实例,使用Kubernetes服务作为我运行的许多IdentityServer的外观,并且能够使用多个IdentityServer实例进行身份验证它可以共享数据,只要它们都为我的调用Web应用程序提供完全相同的权限,并且可以在一个或多个实例死亡时处理彼此的请求.

任何帮助或见解将不胜感激.

c# asp.net-mvc scaling kubernetes identityserver4

11
推荐指数
1
解决办法
2436
查看次数

将掩码应用于位图并在运行时生成合成图像

背景

我正在尝试使用c#4.0和WPF从头开始创建2D tile引擎.我并不是想在这个星球上构建下一个最伟大的2D游戏,而是试图学习如何使用.NET来操纵图像和图形.

目标

我正在尝试将掩码应用于位图.我的位图是彩色的,我的掩码是单色位图.在哪里出现白色,我试图用透明颜色替换相应位置的原始位图中的颜色.

我的目标是能够将一组图像存储在内存中,这些图像已经在运行时被屏蔽,以便我可以在图层中构建它们的复合 - 即首先是背景,是地图上的项目,最后是根据需要,玩家头像.

到目前为止我看过的......

我已经在这一段时间了很长一段时间,因此我在SO上发帖 - 以下详细介绍了迄今为止我所看到的内容:

在c#System.Drawing中查看过这个帖子的Alpha掩码?其中显示了如何使用不安全的方法使用指针算法操作图像.

此外,这篇文章创建图像蒙版,显示如何使用SetPixel/GetPixel交换颜色.

各种MSDN页面和其他包含该主题的特别博客.

我试过的......

我已经尝试了不安全的指针算术方法:这样的事情(请注意这已被屠杀,重新组合,并重复,因为我一直在修补,试图理解为什么这不是我想要它做的事情):

private static Bitmap DoApplyMask(Bitmap input, Bitmap mask)
    {
        Bitmap output = new Bitmap(input.Width, input.Height, PixelFormat.Format32bppArgb);
        output.MakeTransparent();
        var rect = new Rectangle(0, 0, input.Width, input.Height);
        var bitsMask = mask.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
        var bitsInput = input.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
        var bitsOutput = output.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
        unsafe
        {
            for (int y = 0; y < input.Height; y++)
            {
                byte* ptrMask = …
Run Code Online (Sandbox Code Playgroud)

c# wpf mask tile

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