小编Wap*_*pac的帖子

如何以编程方式创建有效的自签名X509Certificate2,而不是从.NET Core中的文件加载

我目前所做的是使用OpenSSL生成PFX文件.这导致了不必要的依赖,特别是对于Windows用户.所以我找到了一些关于如何使用BouncyCastle创建自己的证书的示例,但是这个库不兼容.NET Core(或者我找不到兼容的包).

那么,是否可以仅使用.NET内核创建自己的自签名X509证书,以避免依赖OpenSSL(或任何其他证书生成外部工具)?

编辑:有人(编辑?)建议这个问题如何使用C#创建自签名证书?提供了答案.遗憾的是,这与.NET Core无关.接受的答案从那开始This implementation uses the CX509CertificateRequestCertificate COM object (and friends - MSDN doc) from certenroll.dll to create a self signed certificate request and sign it,显然不是.NET Core ......实际上,没有一个答案是.NET Core兼容的.

c# pfx x509certificate2 .net-core

19
推荐指数
2
解决办法
7528
查看次数

带有 SQLite 的 EF Core,代码优先,不区分大小写 包含一列,对其他列敏感

我有使用 SQLite 数据库和代码优先方法的 EF Core 1.1.0 预览版。我在表 A 和 B 中有两个字符串。我已经检查过,如果我有

IQueryable<T> query = dbSet;
query = query.Where(i => i.A.Contains(pattern));
Run Code Online (Sandbox Code Playgroud)

匹配区分大小写。这就是字符串 A 所需要的,但是当我想查询字符串 B 时,我想指定不区分大小写的匹配。

是否可以?

我目前的解决方法是使用 ToLower:

query = query.Where(i => i.B.ToLower().Contains(pattern.ToLower()));
Run Code Online (Sandbox Code Playgroud)

这很有效,但我不确定这是最好的解决方案。

在我的 OnModelCreating 覆盖中,我尝试使用

  modelBuilder.Entity<E>().Property(i => i.B).HasAnnotation("CaseSensitive", false);
Run Code Online (Sandbox Code Playgroud)

但这没有效果,匹配(不使用 ToLower)仍然区分大小写。

有没有办法说实体内的这个 B 字符串应该总是不区分大小写(即 ==、包含、StartsWith、EndsWith 之类的操作)?

从日志中,我可以看到查询转换为

    SELECT ...
    FROM ... AS "i"
    WHERE ((instr("i"."B", @__pattern_0) > 0) OR (@__pattern_0 = ''))
Run Code Online (Sandbox Code Playgroud)

sqlite case-sensitive matching ef-code-first entity-framework-core

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

如何在开发人员计算机上构建MSVS 2017 .NET Core .exe?

有关TLDR,请参阅下面的EDIT部分.

我使用了MSVS 2015社区并升级到MSVS 2017.我正在开发.NET Core控制台应用程序.我在这里只讨论我的本地开发机器,它安装了MSVS,并且安装了.NET Core运行时和SDK.

在MSVS 2015中,使用了project.json文件,默认情况下,构建过程在其中生成了一个DLL文件,bin/Debug/netcoreapp1.1可以使用dotnet run命令运行.但是有一个选项可以在project.json文件中做一个小调整:

...
"Microsoft.NETCore.App": {
  "version": "1.0.1",
  "type": "platform"
},
...
Run Code Online (Sandbox Code Playgroud)

- >

...
"Microsoft.NETCore.App": {
  "version": "1.0.1" 
},
...
Run Code Online (Sandbox Code Playgroud)

并添加一个runtimes部分,如

"runtimes": {
  "win10-x64": {}
}
Run Code Online (Sandbox Code Playgroud)

如果您这样做并构建了您的项目,则会创建一个可以直接运行dotnet run的EXE文件,而不使用.

现在的问题是,使用csproj XML文件在MSVS 2017中是否可以?更具体地说,没有繁重的自包含部署是否可能?我确实希望它没有完整的SDD发布,因为我在开发过程中使用这些可执行文件进行本地测试.一旦要发布项目,我就会进行SDD发布,但这在开发过程中非常不方便.

该项目已转换为MSVS 2017,但它只会再次生成DLL文件.所以,我试图创建一个全新的空hello世界程序,并尝试从中获取EXE文件.hello world csproj文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

这只会生成您可以运行的DLL文件dotnet run.可以对此进行更改:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp1.1;net46</TargetFrameworks>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

这非常接近我想要的 - 生成一个EXE文件.但是,这会创建运行.NET Framework …

exe csproj .net-core visual-studio-2017

4
推荐指数
1
解决办法
3338
查看次数

用于大量项目的 C# 字典

我想了解在 C# 中将大量项目存储在内存中的成本。我需要使用的数据结构是字典或类似的。假设我想要的项目数量约为 1 亿,但应用程序不会立即达到该数量。我们需要很长时间才能达到极限。

我担心摊销的运营成本,但我不能在任何特定时刻承受太高的成本。所以通常使用动态数据结构,当结构已满时,它会重新分配自己。在字典的情况下,我认为它甚至会重新索引每个项目。因此,假设我们是应用程序维护 2000 万个刚刚达到字典容量的项目的关键点。然后,当分配新的字典存储时,需要重新索引这 2000 万个项目。

这就是为什么我认为一系列字典可能是个好主意的原因。假设我创建了 256 个字典。这立即将每个内部字典的大小限制为少于 100 万个项目,这应该是易于管理的,并且所有索引都发生在多达 100 万个项目的过程中。这样做的成本似乎只是每次操作一个额外的索引以找到要查看的正确字典。

这是一个合理的方法吗?我的分析是正确的还是我认为 C# 字典会因为某种原因表现得更好?有没有其他更好的解决方案?我正在寻找一种与 C# 字典具有相同时间复杂度的数据结构。

编辑:字典键是一个随机值,所以我可以用它的第一口来非常便宜地找到我在 256 个字典数组中的索引。

我目前不考虑使用数据库,因为我希望所有项目都能以极低的成本立即可用。我确实需要以很少的开销在恒定时间内查找。我可以承受插入速度变慢,但仍然是恒定的时间。与删除相同,可以慢一点,但需要恒定的时间。

应该可以容纳内存中的所有项目。这些项目很小,每个大约有 50 个字节的数据。所以数据结构对于每一项都不能有太多的开销。

c# dictionary

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

登录多线程异步代码

我有一个带有异步处理的多线程应用程序(它本身使用许多线程)。如果没有异步,很容易记录并跟踪执行流程,因为只需将当前线程标识符放入日志中,您就可以看到哪个日志行由哪个线程执行。

如何在异步环境中实现类似的事情?通常在调用 await 时,以下代码会分配给另一个线程(我对此没有意见,我相信线程池管理器会有效地为我完成这些分配)。问题是,突然间我没有执行流程的这个固定线程 ID,很难将这两个部分放在一起。

是否有任何任务标识符会保留在整个代码中?我的意思是假设一个方法中有 5 次等待调用。使用线程 ID,我可以在日志中看到多达 6 个不同的 ID。我想要一件事,我更喜欢它已经存在(我知道我可以创建一个对象并将它一遍又一遍地传递给我的日志函数,但如果已经有了东西,那就更好了)。

Task.Id 或 Task.CurrentId 是否适合此目的,还是其他什么?

c# logging multithreading async-await

2
推荐指数
1
解决办法
1274
查看次数