小编Kir*_*nko的帖子

C#7.3枚举约束:为什么我不能使用可空的枚举?

既然我们有枚举约束,为什么编译器不允许我编写这段代码?

public static TResult? ToEnum<TResult>(this String value, TResult? defaultValue)
    where TResult : Enum
{
    return String.IsNullOrEmpty(value) ? defaultValue : (TResult?)Enum.Parse(typeof(TResult), value);
}
Run Code Online (Sandbox Code Playgroud)

编译器说:

错误CS0453类型'TResult'必须是非可空值类型才能在泛型类型或方法'Nullable'中将其用作参数'T'

c# enums roslyn c#-7.3

40
推荐指数
2
解决办法
3894
查看次数

.NET核心程序集中非常特殊的PublicKey

我注意到核心.NET程序集的PublicKey = 00000000000000000400000000000000.它不仅比sn.exe允许生成(最小384位)更短,而且还有很多零.

如何用如此精美的公钥生成签名密钥?

.net strongname .net-assembly public-key

8
推荐指数
1
解决办法
409
查看次数

从ASP.NET查询远程计算机时WMI访问被拒绝错误

我有一个ASP.NET应用程序,该应用程序执行对远程系统的WMI调用。应用程序Web.config包含<identity impersonate =“ true”>和<authentication mode =“ Windows”>选项,据我所知,这些选项应强制应用程序代码代表应用程序用户执行。

问题是,尽管我可以成功地从PowerShell控制台在同一用户下的同一主机上的PowerShell控制台上成功执行我的WMI请求,但仍收到“拒绝访问”错误,但该远程服务器仍然存在。

// this doesn't work
ManagementScope scope = new ManagementScope();
scope.Path.NamespacePath = "root\\virtualization";
scope.Path.Server = "vs01";
scope.Connect(); // <-- here comes exception

# this works just fine
Get-WmiObject -Namespace 'root\virtualization' -Class Msvm_ComputerSystem -ComputerName vs01
Run Code Online (Sandbox Code Playgroud)

转储HttpContext.Current.User.Identity.Name,System.Security.Principal.WindowsIdentity.GetCurrent()。Name,System.Threading.Thread.CurrentPrincipal.Identity.Name属性建议模拟正常工作。

有想法吗?问题可能是某种.NET或IIS安全性吗?

asp.net security powershell wmi

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

将unique_ptr / shared_ptr与API函数一起使用,通过指针将资源作为出参数返回

我现在在当前项目中赶上C ++ 11/14。我在使用unique_ptr/ shared_ptr和API函数通过指针返回资源作为出参数时遇到麻烦。

让我们考虑DsGetDcName(..., __out PDOMAIN_CONTROLLER_INFO* ppDCI)一个例子。

在c ++ 11之前,存在使用Windows API的广泛模式。我将拥有一个RIIA类,其中包含PDOMAIN_CONTROLLER_INFO,调用NetApiBufferFree析构函数,并具有PDOMAIN_CONTROLLER_INFO* operator&()这样的功能:

info_ptr spInfo;
DsGetDcName(..., &spInfo);
Run Code Online (Sandbox Code Playgroud)

现在使用C ++ 11/14,我看到很多文章都提倡unique_ptr/ shared_ptr使用自定义删除器以适当的方式释放资源。当资源作为函数的r值返回时,它确实很好用(这LoadLibrary是一个很好的例子)。

我发现的一种解决方案是在API调用之后将原始指针附加到智能指针:

PDOMAIN_CONTROLLER_INFO pDCI = nullptr;
DsGetDcName(..., &pDCI);
std::unique_ptr<DOMAIN_CONTROLLER_INFO, decltype(&NetApiBufferFree)> spInfo(pDCI, &NetApiBufferFree);
Run Code Online (Sandbox Code Playgroud)

但是,这不是我喜欢的方式。据我了解,可能不是因为“安全第一”方法而设计新的智能指针来处理参数。

这里真的可以做点什么吗?也许某种函子类用作参数代理,以便我可以编写DsGetDcName(..., &out_param(spInfo))

winapi pointers smart-pointers c++11 c++14

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