在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_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服务时,将启动多个进程.
这个 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) 假设我在Web服务器中运行了一些PHP代码,例如,运行一个简单的CakePHP应用程序.从这个应用程序,我想偶尔与一些服务器建立TLS连接以交换一些数据.这通常是怎么做的?(我对PHP没什么经验.)
建议使用哪些PHP插件或库或其他方法来完成TLS连接?哪些地方可以开始寻找?(我最初的谷歌搜索给了我很大比例的噪音信号.)
将X509私钥放在Web服务器上涉及哪些安全问题?要建立TLS连接,我将需要X509证书和相应的私钥,可能需要PEM文件,或DER文件,或Java密钥库,或其他任何东西.这个私钥是否会位于Web根目录下易受攻击的位置?这通常如何处理?有哪些安全问题,特别是保护用于建立TLS连接的私钥的安全问题?什么是最佳做法?
编辑:我忘了提到PHP应用程序连接的服务器需要提供客户端证书.客户端确实需要私钥才能连接.此外,我连接的服务器不是 HTTP服务器 - 我只需要在与服务器的普通套接字连接上读取/写入(通过SSL/TLS连接).
当我查询作为表值函数实现的SQL Server 2008系统动态管理视图并返回空结果集时,如何判断空结果集的原因是函数中发生错误,并且那么,那个错误是什么?
如何将 Microsoft C++ Rest SDK for http_client 配置为使用 TLS 1.1 或 1.2 进行连接?它无法连接,因为它使用服务器不接受的较低级别的 TLS。我看不到如何配置它以设置客户端的 TLS 级别。
atl ×1
c# ×1
c++ ×1
closures ×1
com ×1
cryptography ×1
encryption ×1
https ×1
php ×1
ruby ×1
security ×1
sql-server ×1
ssl ×1
windows ×1