kob*_*bi7 2 c# dll dependencies using
是否可以使用在巨大的外部DLL中定义的接口类型,而不引用该DLL?换句话说,将有一个引用外部dll的核心或全局dll,并且所有项目都引用此全局项,因此外部dll对其他项目是隐藏的.
我想在我的代码中使用该类型,同时只知道全局AllInterfaces项目.可以吗?如果是这样,那么这种情况需要做些什么呢?
是否可以使用在巨大的外部DLL中定义的接口类型,而无需在编译时引用该DLL ?
不是,不是.编译器有合理的期望它所需的类型是可用的.
是否可以使用在巨大的外部DLL中定义的接口类型,而无需在运行时引用该DLL ?
是的.我们将该功能添加到C#4中.该功能的"正确"名称类似于"类型嵌入与类型等价",但每个人都称之为"无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"上进行网络搜索,您将找到有关此功能的更多信息.