Я пришел, чтобы ответить сам.
Если это может кому-нибудь помочь:
Я добавил в свой MainWindow.cs:
public delegate void updateNetworkButtonDelegate(string message);
public void updateNetworkButton(string message)
{
if (!test_btn.Dispatcher.CheckAccess())
{
test_btn.Dispatcher.Invoke(new updateNetworkButtonDelegate(updateNetworkButton), message);
}
else
{
test_btn.Content = message;
}
}
}
Я изменил свой TcpClient, чтобы передать Главное окно в параметре:
public static void StartClient(MainWindow mw)
, тогда я мог бы обновить свою кнопку с помощью:
mw.updateNetworkButton (response);
А, DLL использует формат исполняемых файлов PE, и это не слишком хитро для чтения той информации из файла.
Посмотрите этот статья MSDN о Формате файла PE для обзора. Необходимо прочитать заголовок MS-DOS, затем читать структура IMAGE_NT_HEADERS . Это содержит структура IMAGE_FILE_HEADER , которая содержит информацию, в которой Вы нуждаетесь в участнике Машины, который содержит одно из следующих значений
, Эта информация должна быть при фиксированном смещении в файле, но я все еще рекомендовал бы пересечь файл и проверить подпись заголовка MS-DOS и IMAGE_NT_HEADERS, чтобы быть уверенным, что Вы справляетесь с любыми будущими изменениями.
можно также использовать ImageHelp API, чтобы сделать, это - загружает DLL LoadImage, и Вы доберетесь структура LOADED_IMAGE , которая будет содержать указатель на структуру IMAGE_NT_HEADERS. Освободите LOADED_IMAGE с ImageUnload.
Perl Вот грубый сценарий Perl, который сделал задание. Это проверяет, что файл имеет заголовок DOS, затем читает смещение PE из 60 байтов IMAGE_DOS_HEADER в файл.
Это затем ищет на запуск части PE, читает подпись и проверяет его и затем извлекает значение, которым мы интересуемся.
#!/usr/bin/perl
#
# usage: petype <exefile>
#
$exe = $ARGV[0];
open(EXE, $exe) or die "can't open $exe: $!";
binmode(EXE);
if (read(EXE, $doshdr, 64)) {
($magic,$skip,$offset)=unpack('a2a58l', $doshdr);
die("Not an executable") if ($magic ne 'MZ');
seek(EXE,$offset,SEEK_SET);
if (read(EXE, $pehdr, 6)){
($sig,$skip,$machine)=unpack('a2a2v', $pehdr);
die("No a PE Executable") if ($sig ne 'PE');
if ($machine == 0x014c){
print "i386\n";
}
elsif ($machine == 0x0200){
print "IA64\n";
}
elsif ($machine == 0x8664){
print "AMD64\n";
}
else{
printf("Unknown machine type 0x%lx\n", $machine);
}
}
}
close(EXE);
Сырой путь состоял бы в том, чтобы назвать dumpbin с опцией заголовков от инструментов Visual Studio на каждом DLL и искать соответствующий вывод:
dumpbin /headers my32bit.dll PE signature found File Type: DLL FILE HEADER VALUES 14C machine (x86) 1 number of sections 45499E0A time date stamp Thu Nov 02 03:28:10 2006 0 file pointer to symbol table 0 number of symbols E0 size of optional header 2102 characteristics Executable 32 bit word machine DLL OPTIONAL HEADER VALUES 10B magic # (PE32)
Вы видите пару подсказок в том выводе, что это - DLL на 32 бита, включая 14C оценивают того Paul упоминания. Должно быть легко искать в сценарии.
Если Вы имеете установленный Cygwin (который я настоятельно рекомендую по ряду причин), Вы могли использовать утилиту 'файла' на DLL
file <filename>
, который даст вывод как это:
icuuc36.dll: MS-DOS executable PE for MS Windows (DLL) (GUI) Intel 80386 32-bit