У меня есть куча COM-объектов, которые реализуют один и тот же интерфейс, и мне нужно создать один из них, выбранный во время выполнения из списка опций.Поскольку я знаю CLSID для каждого внедряющего COM-сервера, это должно быть легко.Однако для определенного подмножества COM-библиотек я могу выполнить эту работу только в том случае, если я работаю в среде IDE VS2010.
Вот вся программа, которую я использую для тестирования:
using System;
namespace ComTest
{
class Program
{
static void Main(string[] args)
{
var clsid = "{E8978DA6-047F-4E3D-9C78-CDBE46041603}";
var type = Type.GetTypeFromCLSID(new Guid(clsid));
var obj = Activator.CreateInstance(type, true);
Console.WriteLine("Obj is {0}", obj);
}
}
}
Я могу сделать эту работу для каждого COM CLSID, который я пробовал до сих пор, пока я запускаю VS2010.С подключенным отладчиком или без него, а также с подключенным процессом хостинга или без него, я получаю System.__ComObject
обратно от CreateInstance
.
Когда я компилирую и запускаю этот код из окна консоли для определенных значений CLSIDВместо этого я получаю:
Unhandled Exception: System.Runtime.InteropServices.COMException: Creating an instance of the COM component with CLSID {E8978DA6-047F-4E3D-9C78-CDBE46041603} from the IClassFactory failed due to the following error: 80004005.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at ComTest.Program.Main(String[] args) in
Это происходит только с определенными идентификаторами CLSID - например, "{c1243ca0-bf96-11cd-b579-08002b30bfeb}" (встроенный текст IFilter) работает, но "{E8978DA6-047F-4E3D-9C78-CDBE46041603} "(IFilter Acrobat Reader X's) нет.Что я не могу понять, так это то, что запуск через IDE меняет ситуацию, если вызов COM Interop будет успешным.Любые идеи?
РЕДАКТИРОВАТЬ:
Я не работаю VS2010 в качестве администратора, но у меня есть попытался запустить двоичный файл вывода через консоль Powershell с повышенными правами, и он все еще нене работает.
РЕДАКТИРОВАТЬ 2:
До сих пор единственным COM-сервером, который я использовал для воспроизведения этой "ошибки", является AroRdIf.dll из Acrobat Reader X (предыдущие версии работают нормально).Я больше не беспокоюсь о том, чтобы заставить работать определенный IFilter в Acrobat, но я очень обеспокоен тем, что у меня есть код, который работает в моей IDE, но не за ее пределами.Кроме того, у инструмента Windows SDK FILTDUMP нет проблем с загрузкой этого COM-сервера, поэтому я знаю, что это возможно, я просто не знаю как .