更新 - 下面的原始问题
我做了一些额外的测试,现在我相信我的问题的根源是 .NET 如何定位程序集。
正如我在下面提到的,子目录中有 .dll 文件,但我在下面提到的 .dll 文件并不是每个目录中唯一的 .dll 文件。例如,在 \translation\Customer 目录中有一个 Customer.dll 文件和几个标准文件(Translation.dll、Mapping.dll、Execute.dll)。在 \translation\Standard 目录中有一个 Standard.dll,然后是其他标准文件(Translation.dll、Mapping.dll、Execute.dll)。这些文件都是生成的代码(来自不同的项目),这就是为什么每个目录都有标准文件的副本以及与子目录直接相关的文件的原因。
当在我的 Windows 服务应用程序中执行 Customer.dll 文件中的方法时,标准程序集(Translation.dll、Mapping.dll 等)中的其他方法也将被调用。我相信对其他 .dll 文件的调用不会在同一目录中的 .dll 上执行。
例如,我调用 /translation/Customer/Customer.dll 上的方法,然后调用 Translation.dll 上的方法。但是,应用程序不是在 /translation/Customer/Translation.dll 上调用方法,而是首先找到 /translation/Standard/Translation.dll 并在该文件上调用该方法。
是否可以强制 .NET 在同一目录中调用这些关联的 .dll 文件?或者我是否必须做一些事情来使每个目录中唯一命名的“标准”程序集?
原始问题:
我有一个 C# Windows 服务应用程序,它监视一个目录并处理传入的文件。每个被处理的文件都有一组针对该文件运行的可配置任务。每个任务的代码都包含在一个外部 .dll 中,该 .dll 在运行时使用反射动态加载。<probing>
外部 .dll 存在于主应用程序文件夹的多个子目录中,并且通过app.config 文件中应用程序元素中的条目授予对它们的访问权限。
我最近扩展了子目录的数量以更好地组织外部 .dll,并且我遇到了该<probing>
元素的一些意想不到的功能。我正在运行测试来处理需要对文件执行 2 个任务的文件。第一个任务存在于文件 Customer.dll 中,位于名为“\translation\Customer”的子文件夹中。第二个任务存在文件 Standard.dll,位于名为“\translation\Standard”的子文件夹中。
如果我的探测元素看起来像这样<probing privatePath="translation\Customer;translation\Standard">
,第二个任务(在“标准”文件夹中的 .dll 上运行方法)将无法执行。
但是,如果我切换这些条目以使探测元素看起来像这样,则<probing privatePath="translation\Standard;translation\Customer">
两个任务都会成功执行。
谁能帮我理解为什么探测元素中子目录的顺序会对这些子目录中包含的 .dll 的执行产生影响?