2016-10-21 41 views
0

我可以指定某种方式,我添加的引用具有强名称X或强名称Y?是否可以引用指定多个强名称的.NET dll

我的.DLL引用了Microsoft.Exchange.WebServices.dll。不幸的是,它的nuget版本太旧了,没有一些错误修正。所以我从Github下载它(它更新)并且构建它。所以我现在引用我自己的版本的Microsoft.Exchange.WebServices.dll。这可以工作,但我的.DLL的一些用户可能需要使用原始的Microsoft.Exchange.WebServices.dll(例如,如果他们可以通过nuget安装库),尽管nuget的版本没有有用的错误修正。

我想这样,以便我的lib可以引用任何Microsoft.Exchange.WebServices.dll,具体取决于哪一个。因此,参考文件必须允许来自Microsoft的强名(来自nuget)和强名。我能否以某种方式指定给定.dll的允许强名称列表?

+0

您可以为lib和正面动态加载不同版本创建外观。或者如果你不需要立面只是动态负载。 – BWA

+0

谢谢。但是,我不确定在High Trust ASP.NET环境中是否允许动态加载(至少默认情况下)。我听说在这个级别上强加了反射的严重限制。 – Alex

+0

例如,似乎适用于我的任务的AppDomain.AssemblyResolve事件标有SecurityCriticalAttribute,因此“需要对直接调用方的完全信任。此成员不能被部分可信或透明的代码“。 – Alex

回答

1

我可以指定某种程度上我添加的引用具有强名称X或强名称Y吗?

没有,因为你还没有明白这个概念很好,敬请谅解强名称密钥不是一个单纯的命名,这是一款基于公私组合键,其中一个二进制使用签名的加密形式私钥公钥与用户可用,以确保防篡改。你不能这样做,因为Microsoft.Exchange.WebServices.dll你需要微软的证书用于加密,基本上访问他们的私钥,这是不可能的。

你主要的问题,虽然你是好有一种编译Microsoft.Exchange.WebServices.dll从GitHub的代码,但你的客户仍可能得到的NuGet版本,他们不会一起工作。特别是因为它的同一版本,一个签字,另一个无符号

你的选择是因为你编译二进制,那么虽然你的代码将使用微软的代码作为一个自定义的二进制重命名Microsoft.Exchange.WebServices.dll到自定义名称,自定义命名空间,客户仍然可以获得Nuget版本,即使他们直接使用API​​或从GAC加载它们,也不会发生任何冲突。

接听OP的评论:

注释1:

如果您是从MS库,这意味着您将创建一个包装使用库露出类型,那么无论如何客户和Nuget库在处理类似的API时会遇到困难,直到并且除非它们被捆绑在您的独特命名空间下进行清晰的分界。事实上,请注意,即使签名也是行不通的,因为在给定的时间点,只有一个具有给定名称和版本的程序集可以加载到应用程序域中,签名负责防范篡改。如果你改变的版本也可以工作,但可以在运行时会导致非常奇怪的和意想不到的问题

注释2:

感谢进一步澄清,你只想签署MS库与公共 - 私人组合键:

  • 如上所述仍然不会加载,由于相同的名称和版本问题
  • 选择是重命名或至少更改版本

您正在尝试执行的操作将会进行编译,但在运行时会导致意外的二进制解析问题。正如你有来自Github的代码,最好是具有自定义名称的镜像,具有100%的预期行为。

+0

不幸的是,这不是我的选择,因为客户需要使用我的库中的输出,并且此输出是Microsoft.Exchange.WebServices.dll类。即我的图书馆不只是使用这个DLL,但公开的API使用它的类型。同样有两套类型会让我的顾客生活变成噩梦。似乎唯一的选择,我会提供两个版本的.dll - 一个在nuget(编译与nuget的版本的MS DLL)和另一个 - 独立(并与Github版本的MS DLL编译).. – Alex

+0

此外我不确定你是否理解我的问题。我没有试图用MS证书签署Exchange lib或忽略密钥检查。我想引用用MS或者我的证书签名的Exchange库。即所有源Exchange库保持原样,而在我的lib中,引用会告诉Exchange库必须具有公钥“X”或公钥“Y”。只需将它作为允许的公钥的向量而不是标量即可。不过,这将是一个严格的检查,因为如果有问题的dll没有用X或Y签名,那么引用将在运行时失败,从而阻止未经授权的代码被执行。 – Alex

+0

查看我的编辑评论 –

相关问题