Как программно проверить DLL-файлы C ++ и C # DLL-файлы на наличие ссылок на отладочную DLLS для автоматизации процедуры тестирования - PullRequest
5 голосов
/ 01 августа 2011

Я сталкивался с этой проблемой слишком много раз, и мне нужен автоматизированный подход:

У меня есть несколько DLL-файлов, которые постоянно создаются / изменяются и используются несколькими проектами.

Я создал приложение на C #, которое определяет наличие файлов DLL и предупреждает оператора, если они отсутствуют, и убивает программу.В этом приложении на C # я хочу, чтобы он также проверял, является ли это «отладочной» версией - другими словами, он завис бы, если бы он работал на компьютере конечного пользователя.

Теперь я искал высоко ии нашел несколько возможных решений, но все они провалились.

Assembly.LoadFrom(string) не работает для неуправляемого кода.Я могу использовать это для тестирования управляемых DLL-файлов, но не файлов C ++.

Я подумал, что смогу использовать Dependency Walker или аналогичную программу для запуска в моем приложении, чтобы дать мнеданные ссылок на сборку, к сожалению, консоль depends.exe выводит только в файл (и тогда мне придется читать в каждом файле и анализировать его для моих данных (очень интенсивно, плюс я должен включить depends.exe и DLL)файлы в моих проектах)), кроме того, он, кажется, не выводит данные, которые мне действительно нужны (или, по крайней мере, я не смог их сделать).

Также пытался dumpbin , но я не могу заставить его работать на моей машине.

Я также нашел несколько ссылок, которые должны были дать мне источник для Dependency Walker.К сожалению, все они оказались мертвыми.Я бы не подумал, что это так сложно, но по какой-то причине у меня возникают трудности с выяснением, как это автоматизировать.

Некоторые ссылки на источники, которые были полезны для меня, но ни одна изони решили проблему с данными неуправляемой сборки.

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Используйте GetModuleHandle, чтобы проверить наличие DLL с заданным именем. Если вы хотите знать, является ли это отладочной версией или нет, вам нужно скомпилировать эту информацию в EXE-файл и как-то проверить ее. «Отладка» против «Релиз» не является концепцией, встроенной в формат PE; это просто набор параметров компиляции. Многие люди ставят флаг в информации о версии, чтобы указать, является ли это внутренним или общедоступным выпуском.

P / Вызов ссылки для GetModuleHandle

1 голос
/ 01 августа 2011

Если вы знаете имена всех библиотек 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);
 }
...