我遇到基于COM的客户端 - 服务器设置问题.COM服务器使用C#(.NET 4.0)编写,并作为(注册的)本地服务器运行.
根据连接到服务器的应用程序,其他客户端将收到服务器执行失败(HRESULT异常:0x80080005(CO_E_SERVER_EXEC_FAILURE)
这里解释了潜在的问题(在COM部分是完整性感知的部分).我理解它的方式,是由于提升的应用程序创建具有更高完整性级别的服务器这一事实.当另一个未提升的应用程序连接时,不允许连接到同一个实例.当非提升的应用程序创建进程时,在提升的应用程序连接之后也会发生同样的情况.
我试图实现页面上描述的解决方案:修改注册表以设置应允许所有客户端连接的安全描述符.在C++中有一个代码示例,但这在.NET中实际上是相同的:
// Security Descriptor with NO_EXECUTE_UP
var sd = new RawSecurityDescriptor("O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)");
byte[] securityDescriptor = new Byte[sd.BinaryLength];
sd.GetBinaryForm(securityDescriptor, 0);
RegistryKey key = Registry.ClassesRoot.OpenSubKey("AppID\\{APP-ID-GUID}", true);
if (key == null)
{
key = Registry.ClassesRoot.CreateSubKey("AppID\\{APP-ID-GUID}");
}
using (key)
{
key.SetValue("LaunchPermission", securityDescriptor, RegistryValueKind.Binary);
}
Run Code Online (Sandbox Code Playgroud)
但是,这没有达到预期的效果.当第二个客户端尝试创建相关对象的实例时,Windows会尝试启动COM服务器的单独实例,但服务器会阻止两个实例作为同一用户运行.鉴于我设置的权限,我不希望第一个实例启动第二个实例.
由于其中一个客户端应用程序在Medium IL中运行,而另一个客户端应用程序在High IL中运行,因此我还在强制标签上尝试了变体,例如:
O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;ME)
O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)(ML;;NX;;;ME)(ML;;NX;;;HI)
Run Code Online (Sandbox Code Playgroud)
我也尝试ROTFlags
按照页面上的建议将注册表项设置为0x1(ROTFLAGS_ALLOWANYCLIENT),但行为仍然没有变化.
我已经确定LaunchPermission注册表值正在以某种方式使用.我无法发现使用Process Monitor读取它的位置,但是当我使用该dcomcnfg.exe
工具设置相同的密钥时,我可以通过拒绝启动权限来强制服务器加载失败.
我想指出我的服务器进程不需要提升.如何使提升和非提升的进程都能够连接到单个服务器实例?
我有一个单元测试项目,其中包含一些用于数据驱动测试的XML文件.这些文件设置为"构建操作内容","如果较新则复制"或"始终复制".
在大多数情况下,这很好.但是,当我更改其中一个数据文件而不更改任何代码时,Visual Studio根本不会触发构建操作,也不会复制任何XML文件.实际上,我正在使用旧数据文件运行我的单元测试.
我可以触发手动构建,但是如果可能的话我想防止这样的错误.有没有办法让Visual Studio(2008)每次只更改内容文件时执行复制操作?
澄清:XML文件位于单元测试项目内,而不是生产代码项目中.我[DeploymentItem]
对正在运行的测试中的文件集有一个相关属性.
我通常不打算签署我的.NET程序集,所以除了它的基本机制之外我不太了解.对于我正在进行的小项目,有必要签名,我创建了一个用密码保护的新密钥.
我希望在重新编译程序集的某个时间点提示输入此密码,但在创建密钥文件后,我从未需要在任何地方输入密码.这似乎首先打破了密码保护密钥的目的.
我想密码是在某个地方缓存的,但在哪里?它是在某种私人存储?如果我给其他人我的整个解决方案目录中包含密钥文件,他们会被提示输入我输入的密码,还是他们能够在没有密码的情况下签署程序集?
互联网上有很多关于强名称密钥和使用它们的文章,但由于一些奇怪的原因,它们都掩盖了Visual Studio实际使用密码的方式.
更新: 重新启动Visual Studio(和Windows)无效,因此缓存似乎是持久的.删除.suo文件不会改变签名程序集不需要密码的事实.
关于我的服务引用所使用的命名空间,我遇到了问题.我有很多WCF服务,比如命名空间MyCompany.Services.MyProduct
(实际名称空间更长).
作为产品的一部分,我还提供了一个示例C#.NET网站.此Web应用程序使用命名空间MyCompany.MyProduct
.
在初始开发期间,该服务被添加为网站的项目参考并直接使用.我使用了一个返回实现的对象实例的工厂模式MyCompany.Services.MyProduct.IMyService
.到现在为止还挺好.
现在我想更改它以使用实际的服务引用.添加引用并MyCompany.Services.MyProduct
在命名空间文本框中键入后,它会在命名空间MyCompany.MyProduct.MyCompany.Services.MyProduct中生成类.坏!我不想using
因为我正在使用代理类而在几个地方更改指令.所以我试着在名称空间前加上global::
,但是不接受.
请注意,我还没有删除原始程序集引用,并且启用了"重用类型",但显然没有重用.但是,我不想在我的示例网站中保留程序集引用,以便它仍能正常工作.
到目前为止,我提出的唯一解决方案是将Web应用程序的默认命名空间设置为MyCompany
(因为它不能为空),并将服务引用添加为Services.MyProduct
.假设客户想要使用我的示例网站作为起点,并将默认命名空间更改为OtherCompany.Whatever
,这显然会破坏我的解决方法.
这个问题有一个很好的解决方案吗?
总结一下:我想在原始命名空间中生成服务引用代理,而不引用程序集.
注意:我已经看到了这个问题,但没有提供可用于我的用例的解决方案.
编辑:正如John Saunders建议的那样,我已经向Microsoft提交了一些反馈:
反馈项目@ Microsoft Connect
我正在用C#编写WCF服务.最初我的实现有一个静态构造函数来进行一次性初始化,但是正在进行的一些初始化可能(暂时)失败.
看起来静态构造函数只调用一次,即使第一次(失败)尝试引发了异常?任何后续尝试实例化我的类都将立即失败,并且TypeInitializationException
没有实际执行的代码.
C#语言规范声明静态构造函数最多被调用一次,但基本上这会产生一个异常,即使你抓住它也无法从中恢复?
我在这里错过了什么吗?我想我应该向服务的实例构造函数移动任何远程危险的东西,并手动检查类初始化是否已经成功完成了之前?
我想知道如何使用Facebook Graph API将图片添加到活动中.我已经看到了这个问题并尝试了一些关于这个主题的变化,没有任何成功.官方文件似乎没有提及它.
我正在使用PHP来完成这个特定项目,我已经查看了PHP SDK源代码,这对任何方式都没有帮助.使用https://graph.facebook.com/eventid/picture?metadata=1&access_token ... 请求图片元数据似乎无法识别,因此也没有任何帮助.
有没有人遇到过一些关于如何做到这一点的例子或文档?(不关心它是哪种语言)
我想为我的应用程序使用MVC 3和Entity Framework.
该模型将存储在与MVC应用程序不同的程序集中.
我正在做的选择是使用EF生成我的实体或首先使用代码.
首先使用代码,我可以使用[Required]等来装饰成员...但是,如果EF已经从DB生成实体,我将如何添加这些属性?
让EF生成我的实体将节省大量时间,但我希望MVC自动填充验证,具体取决于我如何装饰我的成员.这有意义吗?如果是这样,我该怎么做?
我有MethodInfo
一个GenericMethodDefinition.如:CallMethod<T>(T arg, string arg2)
.GetParameters()方法将为我提供两个ParameterInfo对象,第一个是通用的,第二个不是.如何让ParameterInfo告诉我它是通用的?如果它有约束怎么办?
我有一些代码想要从Microsoft.Azure.ServiceBus迁移到Azure.Messaging.ServiceBus,考虑到前一个包已被视为已弃用。
我不知道如何使用这个新包的一件事是构建/操作连接字符串。具体来说,我使用ServiceBusConnectionStringBuilder从我的配置中解析连接字符串并获取EntityPath
,以及此类提供的一些其他内容。
我是否忽略了某些内容,或者此功能已被完全删除?
.net ×6
c# ×5
asp.net-mvc ×1
azure ×1
build ×1
com ×1
exception ×1
facebook ×1
generics ×1
hashmap ×1
java ×1
methodinfo ×1
namespaces ×1
php ×1
reflection ×1
svcutil.exe ×1
uac ×1
wcf ×1