2015-02-03 8 views
0

Этот вопрос немного отличается от How to determine if DLL is COM or .NET?, в котором я хочу просто определить, нужно ли регистрировать dll как часть инструмента развертывания. Таким образом, это может быть любой вид dll, .net или иначе. Он может быть зарегистрирован или не зарегистрирован.Как определить, является ли dll COM-dll

Моя функция подписи будет:

public bool? IsComDll(string Path) 
{ 

} 

Я хочу, чтобы проверить DLL непосредственно, а не зарегистрировать его, чтобы узнать, потому что это будет оставить побочный эффект.

Я не против использования Assembly функций, если это DLL .Net, но я не буду знать заранее, и мне нужно обрабатывать не .Net-dlls.

Edit:

Вот код, у меня до сих пор. Он работает, за исключением библиотек non .net, которые могут быть или не быть COM, где LoadLibrary возвращает нулевой указатель, который может быть вызван другими причинами, такими как проблема зависимости. Некоторые работы COM-dll работают нормально и возвращают true, например C:\Windows\System32\vbscript.dll. Поэтому я думаю, вы могли бы сказать, что это работает не менее 75% времени.

public T GetAttribute<T>(string AssemblyPath) 
{ 
    return GetAttribute<T>(Assembly.LoadFile(AssemblyPath)); 
} 

public T GetAttribute<T>(Assembly Assembly) 
{ 
    return Assembly.GetCustomAttributes(typeof(T), false).FirstOrDefault; 
} 

public bool? IsComDll(string Path) 
{ 

    if (IsDotNetDll(Path)) { 
     ComVisibleAttribute ComVisibleAttribute = GetAttribute<ComVisibleAttribute>(Path); 
     return ComVisibleAttribute != null && ComVisibleAttribute.Value; 
    } 

    if (Path.Contains(" ")) { 
     Path = string.Format("\"{0}\"", Path); 
    } 

    IntPtr hModuleDLL = LoadLibrary(Path); 

    if (hModuleDLL == IntPtr.Zero) { 
     //we can't tell 
     //TODO: Find out how! 
    } 

    // Obtain the required exported API. 
    IntPtr pExportedFunction = IntPtr.Zero; 

    pExportedFunction = GetProcAddress(hModuleDLL, "DllRegisterServer"); 

    return pExportedFunction != IntPtr.Zero; 

} 

public bool IsDotNetDll(string Path) 
{ 
    try { 
     Assembly.LoadFile(Path); 
     return true; 
    } catch (BadImageFormatException bifx) { 
     return false; 
    } catch (Exception ex) { 
     throw; 
    } 
} 
+0

Возможный дубликат [Как определить тип DLL? (COM, .NET, WIN32)] (http://stackoverflow.com/questions/1420726/how-can-i-detect-the-type-of-a-dll-com-net-win32) – stuartd

+0

@stuartd, связанный с этим вопрос не разрешает коду. Я думаю, что мой вопрос может и, таким образом, улучшить это. – toddmo

+0

Возможный дубликат файла [Check Portable Executable (PE) для COM-подписи] (http://stackoverflow.com/questions/18925735/check-portable-executable-pe-file-for-com-signature) –

ответ

1

библиотеку DLL, которая поддерживает саморегистрацию (обычно COM DLL, но не строго должны быть) будет экспортировать функцию с именем DllRegisterServer или, реже, DllInstall.

Вы можете вручную зарегистрировать такие DLL-файлы с помощью утилиты regsvr32.

Смежные вопросы