【发布时间】:2011-01-25 14:04:21
【问题描述】:
我有一个现有的应用程序,它 P/Invokes 到与应用程序本身位于同一目录中的 DLL。
现在(由于佳能生产了最糟糕的 API 之一)我需要支持这个 API 的两个版本,并在运行时确定我应该使用哪一个(旧的或新的)。由于 DLL 具有相同的名称(第一个加载具有相同名称的其他 DLL,因此仅重命名第一个对我没有帮助)我必须将它们保存在不同的目录中。
因此我的问题是:我必须使用哪些选项来控制 DllImport 声明中给出的 DLL 使用哪个目录?
我想我可以从尝试以下两个想法中的任何一个开始:
1) 在执行第一次 P/Invoke 之前使用“SetDllDirectory”设置我想要的目录,然后再将其重置。
2) 使用“LoadLibraryEx”手动加载所需的 DLL,并希望这样做。
但是还有其他“.NET:ish way”可以先尝试吗?
更新:我意识到我可以在两个单独的 .Net 程序集中填充对 DLL 的所有访问,然后将它们中的每一个与相应的 API 文件放在一个单独的目录中。然后我可以动态加载正确的 .Net 程序集,并且正确的 DLL 的加载会自动发生。有什么不应该起作用的原因吗?
我能想到一个:我将如何调试这些东西?是否可以告诉 Visual Studio 程序集(包含在我的解决方案中)应放置在子目录中并从那里进行调试?
【问题讨论】: