需要使用DllImport导入的非托管DLL版本

时间:2012-06-18 18:55:31

标签: c# dllimport

我正在开发一个将非托管dll导入C#的应用程序。它有一个包装类,可以加载方法以便调用它。这些方法在dll程序中运行良好。我想添加保存正在使用的DLL的版本。我发现由于C# getting version of unmanaged dll我需要使用FileVersionInfo.GetVersionInfo(“my.dll”)。但是,在运行此函数时,它会发现无法找到“my.dll”的异常。 dll位于c:根目录下的文件夹中。此文件夹位于PATH中,根据http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx#search_order_for_desktop_applications,它应该找到它。

知道my.dll文件已加载并且工作原因为什么我也不能在同一个包装器类中调用GetVersionInfo()并找到my.dll所以我可以得到相同文件的版本号?感谢您的帮助,因为我一直在寻找几天。

2 个答案:

答案 0 :(得分:1)

从MSDN,GetVersionInfo的参数是:

  

要检索版本的文件的完全限定路径和名称   。的信息。

所以非常清楚。你需要传递完整的路径,因为它似乎依赖于它。否则,它很可能会在当前目录中查找该文件(因此您的应用程序的目录)。

作为旁注,将本机DLL保存在C:\中是不好的做法。 您应该将其存储在应用程序的文件夹中。然后这个功能可以工作,你的应用程序将更自包含。磁盘周围没有文件传播。 当然,除非你有充分的理由将它存储在C盘的根目录中,否则这是真的。

答案 1 :(得分:1)

它需要完整路径,它不会搜索DLL。这样风险太大,DLL的Windows搜索规则是错综复杂的,需要配置。如果您需要在之前对任何函数进行调整,那么最好的方法是通过调整SearchPath()。如果将第一个参数设置为null,则使用与LoadLibrary相同的算法。

如果你需要在对一个函数进行微调后,那么最好的方法是使用加载的DLL。迭代Process.GetCurrentProcess()。模块以检索ProcessModule.FileName。