2

我正在开发一个将非托管 dll 导入 C# 的应用程序。它有一个包装类来加载方法,以便可以调用它。这些方法在 dll 的程序中运行良好。我想添加保存正在使用的 dll 的版本。我发现我需要使用 FileVersionInfo.GetVersionInfo("my.dll") 多亏了C# 获取 unmanaged 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 以便我可以获得相同文件的版本号?感谢您的帮助,因为我一直在寻找几天。

4

2 回答 2

1

从 MSDN,GetVersionInfo 的参数是:

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

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

附带说明一下,将本机 DLL 保存在 C:\ 中是不好的做法。您应该将其存储在应用程序的文件夹中。然后此功能将起作用,您的应用程序将更加独立。没有文件散布在磁盘周围。当然,除非您有充分的理由将其存储在 C 驱动器的根目录中,否则这是正确的。

于 2012-06-18T19:01:19.273 回答
1

它需要完整路径,它不会搜索 DLL。这太冒险了,Windows 的 DLL 搜索规则很复杂并且需要配置。如果您需要在调用任何函数之前执行此操作,那么最好的方法是调用 SearchPath()。如果将第一个参数设置为 null,则它使用与 LoadLibrary 相同的算法。

如果您需要在调用函数执行此操作,那么最好的方法是使用加载的 DLL。迭代 Process.GetCurrentProcess().Modules 以检索 ProcessModule.FileName。

于 2012-06-18T19:36:09.180 回答