gpt4 book ai didi

c# - 如何以编程方式检查 C++ DLL 文件和 C# DLL 文件的引用以调试 DLLS 以自动执行测试过程

转载 作者:太空狗 更新时间:2023-10-29 23:41:24 25 4
gpt4 key购买 nike

我遇到这个问题太多次了,需要这是一种自动化的方法:

我有多个 DLL 文件,这些文件不断被构建/更改,供多个项目使用。

我创建了一个 C# 应用程序,它检测 DLL 文件是否存在,如果不存在则警告运算符(operator)并终止程序。在这个 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);
}

关于c# - 如何以编程方式检查 C++ DLL 文件和 C# DLL 文件的引用以调试 DLLS 以自动执行测试过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6903256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com