25

我的项目(某种处理引擎)分为 2 个 dll:一个带有接口声明,一个带有功能。通常该项目由外部 Delphi 项目通过 COM 技术使用。

假设我的程序切水果。外部delphi程序创建Fruit对象并填充其属性:权重(int),名称(字符串)和ProgressUpdater(类型为IProgressUpdater,在带有接口的第二个dll中声明)。在这个exst程序创建器切片器之后,制作切片器.AddFruit(newFruit)并调用 Slicer.Slice()。

没什么特别的。在现实生活中的 delphi 项目是 Outlook 插件。但问题是——有时一些 VSTO 插件会使 Outlook 在“影子复制文件”模式下工作,因此当 delphi 项目启动并创建 Slicer 对象时,我们的 c# 程序集将被放入临时文件夹中,并且程序集将使用此本地路径创建。嗯......这仍然不是问题。但问题是当delphi项目创建newFruit然后传递ProgressUpdater对象时,在我的切片器程序集中我无法获取外部ProgressUpdater:“返回参数的类型无效”,但仍然可以获得简单类型(重量,名称)的字段。

它仅在 shadowCopyFiles 模式打开时发生。所以我的猜测是——外部 ProgressUpdater 的程序集和 Slicer 程序集放在不同的地方,所以不能通过。我的问题是如何避免我的 dll 被“影子复制”?还是有一些不同的解决方案?

4

2 回答 2

2

因此,我仍然没有确切问题的答案。但是问题通过使用 GAC 得到了解决(感谢 HansPassant),因为 GAC 上的程序集永远不会被影子复制(实际上链接器总是首先探测 GAC 中的程序集,然后在其他地方)。

该问题的可能答案是采用 currentDomain.AssemblyResolve 方式,但我无法将此解决方案应用于仅包含公共接口(类型)的 dll。在某些情况下,它可能是合适的解决方案。

于 2015-08-27T07:48:15.507 回答
1

您可以使用反射从您想要的任何位置动态加载 DLL。如果你可以这样做,我可以提供更多代码来加载 DLL。

于 2015-08-29T08:56:19.087 回答