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

时间:2015-08-17 08:24:19

标签: c# .net 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被“影子复制”?还是有一些不同的解决方案?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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