在C#中将'0'作为枚举的默认值有什么意义?如果我声明以不同数字开头的枚举:
enum Color
{
Blue = 1,
Green,
Red,
}
Run Code Online (Sandbox Code Playgroud)
然后var color = default(Color)
- 将返回'0'.我希望看到最小值.如果枚举的每个成员对应于某个特定数字并且"0"不是有效值,则此行为可能会导致问题.
我有一个由另一方提供的证书文件,我正在我的应用程序中加载该文件,但无法导出其私钥参数。看起来证书使用的是 CNG 而不是 CryptoAPI,所以我无法直接访问私钥,只能使用 GetRSAPrivateKey() 方法。该方法返回RSACngKey
而不是RSACryptoServiceProvider
which 是 RSA 的不同实现。问题是返回的密钥似乎在其导出策略中丢失CngExportPolicies.AllowPlaintextExport
,因此我无法从此证书导出 RSA 参数。我可以通过生成一个缺少必要导出策略的新证书来重现该问题:
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
namespace TestRsaCngConsole
{
class Program
{
static void Main(string[] args)
{
var oldCertificate = CreateCertificate();
var oldCertificateBytes = oldCertificate.Export(X509ContentType.Pfx, "");
var newCertificate = new X509Certificate2(oldCertificateBytes, "",
X509KeyStorageFlags.Exportable |
X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.PersistKeySet);
LogCertificate(oldCertificate, "old certificate"); // this fails
LogCertificate(newCertificate, "new certificate"); // works only on Win10
Console.ReadKey();
}
private static X509Certificate2 CreateCertificate()
{
var keyParams = new CngKeyCreationParameters(); …
Run Code Online (Sandbox Code Playgroud) 为了设置我的Web应用程序,我需要完全控制'NETWORK SERVICE'
帐户的某个文件夹.它工作正常,但在非英语系统上,我得到了System.Security.Principal.IdentityNotMappedException
.这是因为此内置帐户的名称已针对该系统进行了本地化(我使用的是带编码的值'NETWORK SERVICE'
).有没有办法以编程方式找出本地化版本'NETWORK SERVICE'
是什么?
stackoverflow上已经有一些类似的问题,但我还没有找到答案
我有一个由几个标签页组成的应用程序.其中一个我一次只加载了几十个用户控件的列表.目前我在Load事件中这样做,因为我在加载此页面之前有一点延迟.我想要做的是使UI更具响应性,并在页面完全加载后填充列表.有没有办法跟踪用户控件何时完全加载它的内容?
VisibleChanged也没有帮助,因为它在显示任何其他子控件之前触发.当我开始加载控制列表时,当某些子控件仍然不可见时,这会导致一些丑陋的视觉效果.
编辑
为了更清楚.我在页面容器上有一些子控件,我有一个我想要稍后加载的自定义控件列表.以下几个答案中描述的两种方法的问题是,当我开始加载控件时,他们不会让容器上的其他子控件显示出来,这就是为什么我会有那些丑陋的效果(我正在这样做BackgroundWorker,但无论如何它必须与主线程交互以向列表添加控件)
我需要使用私钥导出和导入生成的证书到字节数组和从字节数组导入,除非我使用.NET framework 4.0和4.5,否则我没有任何问题.我正在使用BouncyCastle库生成自签名证书,然后将它们转换为.NET格式(X509Certificate2对象).不幸的是,升级到最新的框架我无法导出私钥.这是代码:
using System;
using System.Diagnostics;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Prng;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509;
namespace X509CertificateExport
{
class Program
{
static void Main(string[] args)
{
var certificate = Generate();
var exported = certificate.Export(X509ContentType.Pfx);
var imported = new X509Certificate2(exported, (string)null, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
Console.WriteLine("Certificate has private key: " + imported.HasPrivateKey);
Console.ReadKey();
}
public static X509Certificate2 Generate()
{
var keyPairGenerator = new RsaKeyPairGenerator();
var secureRandom = new …
Run Code Online (Sandbox Code Playgroud) 我创建了一个绑定到bindingSource的XtraTreeList控件,它使用了一个自定义对象列表.MultiSelect属性设置为true,因此当用户选择多个节点时,我想定义哪些对象绑定到它们.但不幸的是,我没有找到任何与包含数据相关的属性(除了过时的数据并且始终为null).我也尝试使用TreeListNode.GetValue,但它只给我一个显示值而不是对象本身
有没有办法访问绑定到XtraTreeList中的节点的对象?
最后一种方法是使用Unbound模式并手动创建它们,但我想知道是否有一个简单的解决方案
关于C#中文件路径的比较已经存在一个问题.但提供的解决方案意味着我有绝对的路径.任何人都可以建议一个良好的相对路径解决方案或指向我在比较路径时必须注意的事情(在Windows上).
例如:
share/logs
share\logs
share/logs\
那些字符串意味着相同的路径
我有一个提供API的程序集,并由一些其他程序集使用.我需要验证较新版本的API dll是否仍然与使用旧版API的旧程序集兼容.
我发现了几个问同样的问题,但没有解决问题的答案:
建议的工具只能比较两个程序集,并说明API中是否存在可能的重大更改,但如果最新的API确实破坏了使用它的旧程序集,则不会.我想找一个工具或编写一个能够检查每个旧dll是否可以使用我的新API dll的测试.
至于API的变化,我更有可能只扩展它,但即使它仍然可以破坏旧程序集中的代码.这些变化的一些例子可以在这里找到:
现在,我看到的唯一解决方案是使用最新的API编译旧程序集的源代码,但我想只使用程序集并将它们作为单元测试的一部分添加.有什么更好的方法可以处理吗?
编辑:
我正在寻找一种能够自动验证.net程序集之间向后兼容性的过程的工具.(命令行或者也有一些api)
我有一些主机名,我需要比较并告诉它们是否代表同一主机,例如:
localhost
127.0.0.1
machineName
Run Code Online (Sandbox Code Playgroud)
在C#中最可靠的方法是什么?现在我这样做:
private bool CompareHosts(string host1, string host2)
{
UriBuilder builder1 = new UriBuilder();
builder1.Host = Dns.GetHostAddresses(host1)[0].ToString();
var uri1 = builder1.Uri;
UriBuilder builder2 = new UriBuilder();
builder2.Host = Dns.GetHostAddresses(host2)[0].ToString();
var uri2 = builder2.Uri;
return Uri.Compare(uri1, uri2, UriComponents.Host,
UriFormat.Unescaped, StringComparison.OrdinalIgnoreCase) == 0;
}
Run Code Online (Sandbox Code Playgroud)
我没有包含主机地址数组的错误处理,但我不知道如果它将返回多个地址该怎么办,这是否意味着它们将代表不同的机器?有没有更好的方法来比较它们?我需要检查那些主机是否指向同一台机器.
我有以下示例:
namespace ComparisonExample
{
class Program
{
static void Main(string[] args)
{
var hello1 = new Hello();
var hello2 = new Hello();
// calls Hello.Equals
var compareExplicitly = hello1.Equals(hello2);
// calls Object.Equals
var compareWithGenerics = ObjectsEqual<Hello>(hello1, hello2);
}
private static bool ObjectsEqual<TValue>(TValue value1, TValue value2)
{
return value1.Equals(value2);
}
}
class Hello : IEquatable<Hello>
{
public bool Equals(Hello other)
{
return true; // doesn't matter
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是为什么在第二个"Equals"调用中,我被重定向到Object.Equals而不是Hello.Equals,即使我在泛型参数中指定了确切的类型?
c# ×10
comparison ×3
certificate ×2
winforms ×2
api ×1
bouncycastle ×1
cng ×1
data-binding ×1
devexpress ×1
enums ×1
events ×1
export ×1
host ×1
iis-6 ×1
load ×1
path ×1
rsa ×1
windows ×1
xtratreelist ×1