Gre*_*egM 5 c# dll .net-assembly
我已经多次遇到此问题,因此需要将其作为一种自动化方法:
我有多个正在不断构建/更改以供多个项目使用的DLL文件。
我创建了一个C#应用程序,该应用程序检测DLL文件是否存在,如果不存在则警告操作员并杀死该程序。在此C#应用程序中,我希望它也检查以确定它是否是“调试”版本-换句话说,如果在最终用户计算机上运行,它将崩溃。
现在,我一直在寻找高处和低处,找到了一些可能的解决方案,但它们全都失败了。
Assembly.LoadFrom(string)不适用于非托管代码。我可以用它来测试托管的DLL文件,而不是C ++的文件。
我以为我可以使用Dependency Walker或类似程序在我的应用程序中运行,以向我提供程序集引用的数据,不幸的是,depends.exe控制台仅输出到一个文件(然后我必须读入每个文件并进行解析它用于我的数据(非常费力depends.exe,而且我必须在项目中包括和DLL文件),此外,它似乎没有输出我真正想要的数据(或者至少我无法制作它)。
也尝试过dumpbin,但我似乎无法使其在我的计算机上运行。
我还发现了一些链接,这些链接应该可以为我提供Dependency Walker的资源。不幸的是,他们都死了。我不认为这很难做,但是无论出于何种原因,我都很难弄清楚如何实现此自动化。
一些源链接对我很有帮助,但没有一个可以解决非托管程序集数据的问题。
如果您知道所有 DLL 的名称(例如,因为您运行了 Dependency Walker),则可以仅使用 LoadLibrary 来检查非托管 DLL。
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);
const UInt32 DONT_RESOLVE_DLL_REFERENCES = 0x00000001;
const UInt32 LOAD_LIBRARY_AS_DATAFILE = 0x00000002;
const UInt32 LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008;
[DllImport("kernel32.dll")]
static extern bool FreeLibrary(IntPtr hModule);
[DllImport("kernel32.dll")]
static extern UInt32 GetLastError();
void CheckUnmanagedDll(string DllName)
{
IntPtr hModule = LoadLibrary(DllName);
if (hModule.Equals(IntPtr.Zero))
MessageBox.Show("Can't find " + DllName);
FreeLibrary(hModule);
}
Run Code Online (Sandbox Code Playgroud)