【问题标题】:COM Side by Side Assemblies using dll's from another directory?使用来自另一个目录的 dll 的 COM 并排程序集?
【发布时间】:2012-01-25 14:28:18
【问题描述】:
我很确定答案是否定的,但以防万一:
对于具有适当 SxS 清单的独立 exe,是否可以使用相对路径引用 COM DLL 或从不是当前目录的目录加载它们?
我们在一个网格环境中运行,该环境使用一个公共文件夹作为根来部署各种包(即 zip 文件)。多个应用程序希望从一个公共位置引用一个公共 COM Api(带有 DLL 清单)。但是,由于网格环境是沙盒化的,我们无法安装到 Windows SxS 目录,也不能带外(即不由网格部署)。
我是否希望从 ..\SomeCommonDir\COM.dll 或 C:\Program Files\SomeCommonDir\COM.DLL 加载 COM.DLL ?
作为私有程序集,一切正常。
【问题讨论】:
标签:
com
assemblies
shared
sxs
activation-context-api
【解决方案1】:
这应该可以使用激活上下文来实现。 (我假设你对清单等没问题,因为听起来你可以让它以“标准”方式正常工作......)
here 有“硬核”的做事方式,或者您可以使用 Microsoft.Windows.ActCtx 对象。这些都允许您手动/以编程方式为激活上下文设置 client 清单的位置;客户端清单确实必须与程序集清单和程序集位于同一文件夹中。
This SO question 可能对您有用。这是一种方法的sn-p......
// 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);