我的项目(某种处理引擎)被分成2个dll:一个带有接口声明,一个带有功能。通常项目是通过COM技术由外部Delphi项目使用。
假设我的程序切片水果。外部delphi程序创建Fruit对象并填充其属性:weight (int), Name (string)和ProgressUpdater(类型为IProgressUpdater,在第二个带有接口的dll中声明)。在此现有程序创建器Slicer之后,创建Slicer. addfruit (newFruit)并调用Slicer. slice()。
没什么特别的。在现实生活中delphi项目是Outlook插件。但这里有一个问题——有时一些VSTO插件使Outlook工作在"影子复制文件"模式下,所以当delphi项目启动并创建切片器对象时,我们的c#程序集将放在临时文件夹中,程序集将使用这个本地路径创建。嗯…这仍然不是问题。但问题是当delphi项目创建newFruit然后传递ProgressUpdater对象时,在我的切片器组装中,我无法获得外部ProgressUpdater:"返回参数具有无效类型",但仍然可以获得简单类型(权重,名称)的字段。
它只发生在shadowCopyFiles模式上。所以我的猜测是-外部ProgressUpdater的程序集和切片器程序集被放置到不同的地方,所以它们不能被传递。我的问题是如何避免我的dll被"影子复制"?还是有别的解决办法?
所以我仍然没有确切的答案。但是这个问题通过使用GAC解决了(多亏了HansPassant),因为GAC的程序集永远不会被影子复制(实际上链接器总是首先探测GAC中的程序集,然后再探测其他地方的程序集)。
这个问题的可能答案是进入currentDomain。但我无法将此解决方案应用于仅包含公共接口(类型)的dll。
您可以使用反射从您想要的任何位置动态加载DLL。如果您可以这样做,我可以提供更多加载dll的代码。