是否可以使用在巨大的外部dll中定义的接口类型,而不引用该dll? 换句话说,将有一个引用外部dll的核心或全局dll,并且所有项目都引用此全局项,因此外部dll对其他项目是隐藏的。
我想在我的代码中使用该类型,而只知道全局AllInterfaces项目。 可以吗?如果是的话,需要为这种情况做些什么?
答案 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通过以下属性识别类型:
伪造类型名称空间名称和名称并不困难,难以做到的是伪造程序集属性。如果程序集具有强名称(非null PublicKeyToken),或者如果它存储在GAC中,则无法获取替换。伪造文化和架构并不难,你必须得到正确的显示名称和版本。
当然,您必须正确地接口声明正确。故意调用DLL Hell就像这样,这是一个非常糟糕的想法。至少是因为你现在永远无法加载真正的程序集。