如何只从代码库加载我的DLL?

She*_*est 25 .net c# delphi com shadow-copy

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

让我们说我的程序切片水果.外部delphi程序创建Fruit对象并填充其属性:weight(int),Name(字符串)和ProgressUpdater(类型为IProgressUpdater,在第二个dll中使用接口声明).在此exst programm creater Slicer之后,生成Slicer.AddFruit(newFruit)并调用Slicer.Slice().

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

它仅在启用shadowCopyFiles模式时发生.所以我的猜测是 - 外部ProgressUpdater的装配和切片器装配放置在不同的地方,因此它们无法通过.我的问题是如何避免我的dll被"影子复制"?还是有一些不同的解决方案?

She*_*est 2

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

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