COM бок о бок сборки с использованием DLL из другого каталога?

Я уверен, что ответ - нет, но на всякий случай:

Можно ли для автономного exe-файла с соответствующим манифестом SxS ссылаться на COM DLL, используя относительный путь, или загружать их из каталога, который не является текущим?

Мы работаем в среде grid, которая развертывает различные пакеты (например, zip-файлы), используя общую папку в качестве корневого каталога. Несколько приложений хотели бы ссылаться на общий COM Api (с манифестами DLL) из общего расположения. Однако, поскольку сетка окружена изолированной средой, мы не можем установить ее в каталог Windows SxS, и мы также не можем сделать это вне полосы (то есть не развернуто сеткой).

Есть ли у меня какая-либо надежда сказать, что загрузить COM.DLL из ..\SomeCommonDir\COM.dll или C: \ Program Files \ SomeCommonDir \ COM.DLL?

Все отлично работает как частная сборка.

1 ответ

Решение

Это должно быть возможно с использованием контекстов активации. (Я предполагаю, что вы в порядке с манифестом и т. Д., Так как кажется, что вы можете заставить его работать нормально "стандартным" способом...)

Здесь есть "хардкорный" способ делать вещи, или вы можете использовать Microsoft.Windows.ActCtx объект. Они оба позволяют вам вручную / программно установить местоположение манифеста клиента для контекста активации; манифест клиента должен находиться в той же папке, что и манифест сборки и сборка.

Этот ТАК вопрос может быть полезен для вас. А вот фрагмент одного из способов сделать это...

// Create an activation context
Type actCtxType = System.Type.GetTypeFromProgID("Microsoft.Windows.ActCtx");
dynamic actCtx = System.Activator.CreateInstance(actCtxType);
actCtx.Manifest = @"Path\To\COMClient.manifest";

// Create the object you want, using the activation context
dynamic obj = actCtx.CreateObject("COMTestService.COMTestObject");

// Now use it!
var question = obj.GetQuestionFromAnswer(42);
Другие вопросы по тегам