gpt4 book ai didi

c# - 在不知道 dll 的情况下使用类型

转载 作者:行者123 更新时间:2023-11-30 19:06:46 25 4
gpt4 key购买 nike

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

我想在我的代码中使用该类型,同时只了解全局 AllInterfaces 项目。那行得通吗?如果是这样,对于这种情况需要做什么?

最佳答案

Is it possible to use an interface type that is defined in a huge external dll, without referencing that dll at compile time?

不是真的,不是。编译器有合理的期望它需要的类型是可用的。

Is it possible to use an interface type that is defined in a huge external dll, without referencing that dll at runtime?

。我们将该功能添加到 C# 4。该功能的“正确”名称类似于“使用类型等效的类型嵌入”,但每个人都称其为“无 PIA”。

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

问题是当您的客户购买 Office 时,Office 团队默认不会安装 PIA!因此,必须随您的定制一起运送 PIA。而且 PIA 如此之大,往往是自定义大小的很多倍,这使得你的下载时间更长。等等;无论如何,这都不是理想的情况。

No-PIA 功能允许编译器仅将您实际使用的 PIA 部分链接到您的库中,这样您就不必将 PIA 与它一起发送。

现在,您可能会问“如果我有两个相互通信的自定义项,并且都使用我未发布的 PIA 中的 IFoo 接口(interface)怎么办?”运行时通过 < em>它们来自的程序集,因此两个 IFoo 接口(interface)将被视为不同类型,因此不兼容。

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

在命令行上,使用/L 而不是/R 将程序集引用为“无 PIA”程序集。

在网络上搜索“no PIA”,您会找到有关此功能的更多信息。

关于c# - 在不知道 dll 的情况下使用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9053330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com