Нативный код 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 на удаленной машине:
Задача ещё не решена.