C# 需要与DllImport一起导入的非托管dll版本

C# 需要与DllImport一起导入的非托管dll版本,c#,dllimport,C#,Dllimport,我正在开发一个将非托管dll导入C#的应用程序。它有一个包装器类,用于加载方法以便调用。这些方法在dll中的程序中运行良好。我想添加保存正在使用的dll版本。我发现我需要使用FileVersionInfo.GetVersionInfo(“my.dll”),多亏了。但是,当运行此函数时,它会出现异常,说它找不到“my.dll”。dll位于c:根目录下的文件夹中。此文件夹位于路径中,应根据路径找到它 知道my.dll文件已加载并正常工作,为什么我不能在同一包装类中调用GetVersionInfo()

我正在开发一个将非托管dll导入C#的应用程序。它有一个包装器类,用于加载方法以便调用。这些方法在dll中的程序中运行良好。我想添加保存正在使用的dll版本。我发现我需要使用FileVersionInfo.GetVersionInfo(“my.dll”),多亏了。但是,当运行此函数时,它会出现异常,说它找不到“my.dll”。dll位于c:根目录下的文件夹中。此文件夹位于路径中,应根据路径找到它


知道my.dll文件已加载并正常工作,为什么我不能在同一包装类中调用GetVersionInfo()并找到my.dll,以便获得相同文件的版本号?感谢您的帮助,因为我已经找了几天了。

从MSDN中,GetVersionInfo的参数是:

用于检索版本的文件的完全限定路径和名称 有关的信息

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

另外,将本机DLL保留在C:\中是一种不好的做法。 您应该将其存储在应用程序的文件夹中。然后这个功能就可以工作了,你的应用程序也就更加独立了。没有文件散布在磁盘上。
当然,这是正确的,除非您有充分的理由将其存储在C驱动器的根目录中。

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


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

Ok,我错过了路径和名称要求。有没有办法知道DllImport在哪里找到了dll?也许用DllImport使用的相同方法搜索dll?注意:我不确定dll是否位于c:\之外的子文件夹中。在这种情况下,您不能做太多。在下面,两个版本都使用本机方法GetFileVersionInfo()。这将是一个小的努力,但幸运的是你有一些帮助:SearchPath()是找到文件的最终解决方案。然后GetFileVersionInfo()得到了我的版本号。谢谢你留下的所有想法。有关SearchPath()的详细信息: