使用类型,不知道dll

时间:2012-01-29 12:58:23

标签: c# dll dependencies using

是否可以使用在巨大的外部dll中定义的接口类型,而不引用该dll? 换句话说,将有一个引用外部dll的核心或全局dll,并且所有项目都引用此全局项,因此外部dll对其他项目是隐藏的。

我想在我的代码中使用该类型,而只知道全局AllInterfaces项目。 可以吗?如果是的话,需要为这种情况做些什么?

5 个答案:

答案 0 :(得分:9)

  

是否可以使用在巨大的外部dll中定义的接口类型,而无需在编译时引用该dll?

不是,不。编译器可以合理地期望它所需的类型可用。

  

是否可以使用在巨大的外部dll中定义的接口类型,而不在运行时引用该dll?

即可。我们将这个功能添加到C#4中。"适当的"该功能的名称类似于"类型嵌入与类型等价",但每个人只是称它为#34;没有PIA"。

该功能的动机是Visual Studio Tools For Office开发人员最明显的一个。 VSTO开发人员编写C#代码,例如,使用一些托管代码自定义Excel电子表格。它们通过托管接口与Excel通信,但当然Excel实际上公开了一组COM接口。为弥合这一差距,办公室团队提供了一个主要互操作程序集(PIA)。 PIA是一个庞大的外部库,它只包含描述托管接口如何与COM对象的非托管接口相对应的元数据。

问题是,当您的客户购买Office时,Office团队不会默认安装PIA!因此必须通过您的自定义运送PIA。 PIA非常庞大,通常是定制尺寸的很多倍,这使得下载时间更长。等等;无论如何,这不是一个理想的情况。

No-PIA功能允许编译器仅将您实际使用的PIA部分链接到您的库中,这样您就不必随身携带PIA。

现在,您可能会问" 如果我有两个相互通信的自定义项,并且两者都使用我未发送的PIA的IFoo接口?"运行时通过它们来自的程序集来识别类型,因此两个IFoo接口将被视为不同类型,因此不兼容。

没有PIA"功能也考虑到了这一点。它使用您在COM中用于解决此问题的相同技巧:程序集指示运行时将具有相同GUID的所有接口统一到相同的逻辑类型,即使它们来自不同的程序集。因此,这解释了您使用的每个接口的要求"没有PIA"必须将其标记为具有GUID的COM互操作接口。

在命令行中,使用/ L代替/ R将程序集引用为" no PIA"组装

进行网络搜索"没有PIA"并且您将找到有关此功能的更多信息。

答案 1 :(得分:2)

如果要在代码中使用该接口类型,则该接口应对您的代码可见。你的代码不会编译。

您可以在全局dll中为原始界面编写适配器接口,并在每个位置使用它。

答案 2 :(得分:1)

它无法静态完成,但您可以使用反射来完成。

答案 3 :(得分:0)

使用C#4,您可以使用dynamic关键字。

但是,我没有看到如何事先知道界面会对你有所帮助 - 你怎么知道要调用哪些方法?

答案 4 :(得分:0)

您正试图欺骗输入身份。 CLR通过以下属性识别类型:

  • 装配显示名称
  • [的AssemblyVersion]
  • [AssemblyCulture]
  • 程序集的PublicKeyToken值
  • 程序集的处理器体系结构(隐式)
  • 类型的命名空间名称
  • 类型名称。

伪造类型名称空间名称和名称并不困难,难以做到的是伪造程序集属性。如果程序集具有强名称(非null PublicKeyToken),或者如果它存储在GAC中,则无法获取替换。伪造文化和架构并不难,你必须得到正确的显示名称和版本。

当然,您必须正确地接口声明正确。故意调用DLL Hell就像这样,这是一个非常糟糕的想法。至少是因为你现在永远无法加载真正的程序集。