C# 如何使我的dll只能从代码库加载?

C# 如何使我的dll只能从代码库加载?,c#,.net,delphi,com,shadow-copy,C#,.net,Delphi,Com,Shadow Copy,我的项目(某种处理引擎)分为两个DLL:一个具有接口声明,另一个具有功能。该项目通常由外部Delphi项目通过COM技术使用 让我们假设我的程序切片水果。外部delphi程序创建Fruit对象并填充其属性:weight(int)、Name(string)和ProgressUpdater(类型为IProgressUpdater,在第二个dll中通过接口声明)。在此exst程序之后,生成Slicer.AddFruit(newFruit)并调用Slicer.Slice() 没什么特别的。在现实生活中,

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

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

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


它仅在启用shadowCopyFiles模式时发生。所以我的猜测是-外部ProgressUpdater的程序集和切片器程序集被放置在不同的位置,所以它们不能被传递。我的问题是如何避免我的dll被“影子复制”?或者有不同的解决方案吗?

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


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

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

我对COM技术不是很熟悉,但程序集不应该从GAC获取吗?就像嗯,你是另一个艾丁可疑行为的受害者。如果你没有电话号码,你对此无能为力。但有一件事,使用GAC。编写ComVisible程序集总是一个好主意。@HansPassant问题是我的程序集已经在GAC中注册了。但在一个例子中,Assembly.getExecutionGassembly()位置;显示代码基路径(向regasm注册用于COM互操作的路径)。但在另一个(VSTO附加模块之后)中,系统驱动器上的某个临时路径。我想如果我可以强制.net只从代码库路径加载我的程序集,我就不会有这样的问题了。这是不可能的,GAC程序集永远不会被影子复制。你需要停止谈论水果切片,提供确凿的事实,而不是故事和猜测。显示Excel.exe.config文件的内容,并显示记录所有绑定时从Fuslogvw.exe获得的跟踪。@Jermy,GAC有真正的问题,不应该被发明出来。微软的建议是不要使用它,因为你创建的应用程序需要被计算机上的所有应用程序全局访问。引用文档“作为一般指南,保持程序集依赖项私有,并在应用程序目录中定位程序集,除非明确要求共享程序集。”是的,请提供一个示例。我的情况是,我的dll只包含接口(没有方法),将由Delphi通过COM使用。那么,我如何才能保证当guy在Delphi端执行myCMdell.IProgressUpdater时,它将从代码库加载?@shelet要通过反射加载程序集,您可以这样做:assembly.load(File.ReadAllBytes(path))-在第一次调用之前只加载一次。你也可以看看我的文章:(它是关于其他东西的,但也许其中的某些部分会有用)。