是否可以使用在巨大的外部dll中定义的接口类型,而无需引用该dll?
换句话说,将有一个核心或全局dll,它引用了外部dll,并且所有项目都引用了该全局dll,因此外部dll对其他项目是隐藏的。
我想在代码中使用类型,同时只了解全局AllInterfaces项目。
能行吗?如果是这样,那么在这种情况下需要做什么?
最佳答案
是否可以使用在巨大的外部dll中定义的接口类型,而无需在编译时引用该dll?
不是,不是编译器有合理的期望,即所需的类型可用。
是否可以使用在巨大的外部dll中定义的接口类型,而无需在运行时引用该dll?
是。我们将该功能添加到了C#4中。该功能的“正确”名称类似于“具有类型等效性的类型嵌入”,但每个人都称其为“ No PIA”。
此功能的动机是Visual Studio Tools对于Office开发人员最明显地面临的动机。 VSTO开发人员编写C#代码,使用一些托管代码自定义Excel电子表格。它们通过受管接口与Excel进行通信,但是,当然,Excel实际上公开了一组COM接口。为了弥合这一差距,Office团队提供了一个主要互操作程序集或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”上进行网络搜索,您会找到有关此功能的更多信息。