P /调用动态DLL搜索路径
我有一个现有的应用程序,它将P /调用到与应用程序本身位于同一目录中的DLL。
现在(由于佳能产生了最糟糕的API之一),我需要支持这个API的两个版本,并在运行时确定我应该使用哪一个(旧的或新的)。 由于DLL具有相同的名称(第一个加载其他DLL的名称相同,所以只是重命名第一个DLL不会帮助我),所以我必须将它们保存在不同的目录中。
因此,我的问题:我有什么选择来控制DllImport声明中给出的DLL的目录使用?
我想我可以通过尝试以下两种想法开始:
1)在进行第一次P / Invoke之前,使用“SetDllDirectory”设置我想要的目录,然后重新设置。
2)使用“LoadLibraryEx”手动加载所需的DLL,并希望这会做到这一点。
但是有没有更多的“.NET:ish way”先试用?
更新:我意识到我可以在两个独立的.Net程序集中对DLL的所有访问进行填充,然后将它们中的每一个放置在具有相应API文件的单独目录中。 然后,我可以动态加载正确的.Net程序集,并自动加载正确的DLL。 任何原因,不应该工作?
我可以想到一个:我将如何去调试这些东西? 可以告诉Visual Studio一个程序集(包含在我的解决方案中)应该放在一个子目录中并从那里调试?
我的哀悼,我见过其中一个API,确实令人震惊。 更大的问题是你需要能够说服Windows找到DLL。 他们不会在您的.exe目录中,所以默认不起作用。 使用SetDllDirectory()也可以,使用Environment.CurrentDirectory也可以。 LoadLibrary无法工作,P / Invoke编组将使用LoadLibrary本身。
如果完全可以选择,则可以对两个P / Invoke声明使用不同的名称,对DllImport()构造函数使用不同的参数并使用EntryPoint属性。 听起来不像那样会飞。
我认为第二种选择将起作用,但它需要编写大量代码来管理.net中的dll加载。
第一个也可以工作,但我不喜欢它。
这里是我的建议:你可以在DllImport [DllImport(@"C:dlla32.dll"]
)中指定完整路径(也可以是相对的)
你的第一个选项(P / Invoke和SetDllDirectory)是我个人比较喜欢的选项。 不幸的是,没有“.NETish”的方式来处理加载本地DLL ......这是有道理的。
链接地址: http://www.djcxy.com/p/7739.html