小编Jim*_*ood的帖子

如何在不更改调用方的情况下捕获C#静态字符串资源属性的名称?

在Strings.resx/Strings.Designer.cs中使用字符串资源,使用如下:

myObject.DoSomething(Strings.HelloWorld);
Run Code Online (Sandbox Code Playgroud)

我可以在DoSomething中捕获资源ID(即"Strings.HelloWorld"),而无需更改调用DoSomething的源代码行吗?我想要在Strings.Designer.cs中定义的静态属性的名称,以及字符串值.

我发现的是:

myObject.DoSomething(() => Strings.HelloWorld);
Run Code Online (Sandbox Code Playgroud)

然后:

void DoSomething(Expression<Func<string>> expr)
{
    string id = expr.Body.ToString();
    string value = (expr.Compile())();
    // do something with these...
}
Run Code Online (Sandbox Code Playgroud)

这稍微改变了原始行,但它仍然可读,编译器正在为我检查属性名称.

我想知道是否有任何C#魔术可以在不改变原始行的情况下执行此操作.

编辑:真的,我只想为我用来格式化TraceEvent消息的每个字符串资源使用唯一的int,以用作TraceEvent id.当编译器可以为我做这件事时,我不想自己维护一个int列表,每次插入一个新的源代码行来追踪其他有趣的内容时添加一个.我在初始化时通过将ResourceSet键映射到一系列int来获取我的int,我不介意数字是否从构建转移到构建.

编辑2:参考LBushkin的答案,我最初将字符串映射到int,如下所示:

var resourceSet = resourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true);

var sorted =
    from i in resourceSet.Cast<DictionaryEntry>()
    orderby i.Key
    select i.Value as string;

var valueToId = new Dictionary<string, int>();

foreach (string value in sorted)
{
    valueToId[value] = valueToId.Count + 100; // whatever range you like
}
Run Code Online (Sandbox Code Playgroud)

...但我不喜欢依赖静态CurrentCulture.我想要一个简单的低技术,低维护的资源字符串映射到唯一的int,我需要做的就是在我喜欢的时候在设计器中添加字符串.

c#

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

来自同一用户帐户的LocalServer32 EXE的COM激活是否共享现有进程?

当客户端应用程序调用c_com_ptr :: CreateInstance(使用ATL包装器)时,我启动了一个COM服务器LocalServer32 EXE.

在Windows 7上,当在同一用户帐户下运行的第二个客户端应用程序也调用c_com_ptr :: CreateInstance时,将启动在同一用户帐户下运行的EXE的第二个副本.在过去的生活中,我的印象是第二个客户将分享第一个EXE.

是否共享了LocalServer32进程?什么时候或什么时候不?谷歌搜索答案给我一个巨大的噪音信号比,我找不到答案.

我的CLSID注册表项具有LocalServer32值,提供EXE路径,ProgID,可编程(空字符串),TypeLib(GUID)和VersionIndependentProgId.我有一个AppID密钥.

希望运行的EXE作为服务,我不介意的过程中不共享.我只是想知道规则,所以我知道会发生什么(在Windows Server 2003之后.)

编辑:在下面的Chris回答之后,我检查了服务器中的CoRegisterClassObject调用.我正在使用ATL,并且我覆盖MyServer :: RegisterClassObjects以挂接到CAtlExeModuleT :: RegisterClassObjects的调用链,并看到ATL正在使用CLSCTX_LOCAL_SERVER和REGCLS_MULTIPLEUSE.

将此更改为CLSCTX_LOCAL_SERVER和REGCLS_SINGLEUSE会导致启动更多进程,具体取决于客户端创建的COM对象的数量,如预期的那样.

仍然,回到REGCLS_MULTIPLEUSE,每个COM客户端进程得到一个COM服务器进程,每个服务器进程包含其客户端的所有COM对象,如预期的那样,除非两个COM客户端在同一个用户帐户下运行,它们各自得到自己的服务器,这不是我理解REGCLS_MULTIPLEUSE.

区别在于客户端本身实际上是Windows服务吗?(它们是.)当作为用户帐户运行的Windows服务进程在REGCLS_MULTIPLEUSE下创建COM对象时,这是否被区别对待,导致观察到的行为?为什么我会获得多个流程?(只是为了澄清,我希望我的COM服务器作为Windows服务运行,但使用它的客户端确实作为Windows服务运行.)

此外,将客户端作为本地系统或网络服务运行,REGCLS_MULTIPLEUSE按我的预期工作:只启动一个COM服务器EXE进程.当COM客户端是在用户帐户下运行的Windows服务时,将启动多个进程.

windows com atl out-of-process

5
推荐指数
1
解决办法
2850
查看次数

Ruby 的define_singleton_method 的闭包是如何工作的?

这个 Ruby (2.2.3p173) 代码:

class A
    def msg
        "hello"
    end

    def p
        Proc.new { msg }
    end

    def lam
        lambda { msg }
    end

    def blk
        (1..3).map { msg }.join(" and ")
    end

    def d1(obj)
        obj.define_singleton_method(:say1) { msg }
    end

    def d2(obj)
        bound = msg # <== Why is this needed?
        obj.define_singleton_method(:say2) { bound }
    end
end

a = A.new

puts a.p.call

puts a.lam.call

puts a.blk

obj = Object.new

a.d1(obj)

begin
# Why does this fail?
puts obj.say1
rescue
puts …
Run Code Online (Sandbox Code Playgroud)

ruby closures

5
推荐指数
1
解决办法
548
查看次数

如何在Web服务器中安全地从PHP进行TLS连接

假设我在Web服务器中运行了一些PHP代码,例如,运行一个简单的CakePHP应用程序.从这个应用程序,我想偶尔与一些服务器建立TLS连接以交换一些数据.这通常是怎么做的?(我对PHP没什么经​​验.)

建议使用哪些PHP插件或库或其他方法来完成TLS连接?哪些地方可以开始寻找?(我最初的谷歌搜索给了我很大比例的噪音信号.)

将X509私钥放在Web服务器上涉及哪些安全问题?要建立TLS连接,我将需要X509证书和相应的私钥,可能需要PEM文件,或DER文件,或Java密钥库,或其他任何东西.这个私钥是否会位于Web根目录下易受攻击的位置?这通常如何处理?有哪些安全问题,特别是保护用于建立TLS连接的私钥的安全问题?什么是最佳做法?

编辑:我忘了提到PHP应用程序连接的服务器需要提供客户端证书.客户端确实需要私钥才能连接.此外,我连接的服务器不是 HTTP服务器 - 我只需要在与服务器的普通套接字连接上读取/写入(通过SSL/TLS连接).

php security encryption https cryptography

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

SQL Server表值函数如何报告错误?

当我查询作为表值函数实现的SQL Server 2008系统动态管理视图并返回空结果集时,如何判断空结果集的原因是函数中发生错误,并且那么,那个错误是什么?

sql-server sql-server-2008

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

配置 Microsoft C++ Rest SDK 以使用 TLS 1.1 或 1.2

如何将 Microsoft C++ Rest SDK for http_client 配置为使用 TLS 1.1 或 1.2 进行连接?它无法连接,因为它使用服务器不接受的较低级别的 TLS。我看不到如何配置它以设置客户端的 TLS 级别。

c++ ssl

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