原生C ++代码:
int main()
{
auto hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
COSERVERINFO server = {0, L"Win7x64", nullptr, 0};
MULTI_QI qi = {&IID_XXXService, nullptr, 0};
hr = CoCreateInstanceEx(CLSID_XXXService, nullptr, CLSCTX_REMOTE_SERVER, &server, 1, &qi);
}
成功,任何线程模型。是否有CoInitializeSecurity
的电话。
但是当尝试从.NET / C#实例化同一个对象时,它总是以0x80070005
失败:
static void Main(string[] args)
{
var machineName = "Win7x64";
try
{
Type dcomType = Type.GetTypeFromCLSID(typeof(XXXService).GUID, machineName, false);
object dcomObj = Activator.CreateInstance(dcomType);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
我用CoInitializeSecurity
(DllImported)尝试后者,使用MTA和STA线程属性,使用UAC升级进程,但它总是失败。如果machineName
用于当前机器,则它可以工作(是的,当前开发机器具有相同的COM接口,并且类已注册)。
编辑:为了成功拨打CoInitializeSecurity
,设置'启用Visual Studio托管流程'必须禁用。然而,CreateInstance
失败了。
使用本机代码,它始终有效。使用托管代码,它永远不会工作。可以做些什么?
EDIT2:远程计算机上的COM安全性: