Быстрый и простой ответ: Нет.
Javascript - довольно высокий уровень языка и не имеет доступа к этой информации.
Похоже, что идеальное решение еще не существует. Чтобы обобщить некоторые исследования:
Make My Manifest ( link )
Этот инструмент сканирует проект VB6 для поиска зависимостей COM, но также поддерживает объявление вручную зависимых COM-зависимостей (т. е. используемых через CreateObject).
Интересно, что этот инструмент помещает всю информацию о зависимостях внутри манифеста приложения. Приложение exe и его зависимости описываются как единая сборка, состоящая из нескольких файлов. Я еще не понял, что это возможно.
Выглядит как очень хороший инструмент, но с версии 0.6.6 он имеет следующие ограничения:
Я не тестировал, поддерживает ли он библиотеки .NET com.
regsvr42 ( codeproject link )
Этот инструмент командной строки генерирует файлы манифеста для собственного COM-модуля библиотеки. Он вызывает DllRegisterServer, а затем шпионит за самостоятельной регистрацией, поскольку он добавляет информацию в реестр. Он также может генерировать манифест клиента для приложений.
Эта утилита не поддерживает .NET COM-библиотеки, поскольку они не выставляют подпрограмму DllRegisterServer.
Утилита написана на C ++ , Исходный код доступен.
mt.exe
Часть окна SDK (может быть загружена из MSDN ), которую вы уже имеете, если у вас есть визуальная студия. Здесь зарегистрировано . Вы можете генерировать файлы манифеста для собственных COM-библиотек следующим образом:
mt.exe -tlb:mycomlib.ocx -dll:mycomlib.ocx -out:mycomlib.ocx.manifest
Вы можете создавать файлы манифеста для .NET COM-библиотек следующим образом:
mt.exe -managedassemblyname:netlib.dll -nodependency -out:netlib.dll.manifest
Однако , есть некоторые проблемы с этим инструментом:
<runtime>
и <mvid>
, которые необходимо удалить до того, как манифесты действительно будут работать. Возможно, будущие версии SDK улучшит этот инструмент, я протестировал его в Windows SDK 6.0a (vista).
Чтобы заполнить ProgID, которые mt.exe не включает, вы можете вызвать ProgIDFromCLSID
, чтобы просмотреть их из реестра. Это требует традиционной регистрации COM до завершения файла манифеста, но впоследствии файл манифеста будет самодостаточным.
Этот код C # добавляет ProgID ко всем классам COM в манифесте:
var manifest = XDocument.Load(fileName);
var namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("s", "urn:schemas-microsoft-com:asm.v1");
foreach (var classElement in manifest.XPathSelectElements("s:assembly/s:file/s:comClass", namespaceManager)) {
var clsid = Guid.Parse(classElement.Attribute("clsid").Value);
int result = ProgIDFromCLSID(ref clsid, out string progId); if (result != S_OK) throw new COMException($"ProgID lookup failed for {clsid}.", result);
classElement.SetAttributeValue("progid", progId);
}
manifest.Save(fileName);
Код основан на этих определениях взаимодействия:
[DllImport("ole32.dll")] static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgID);
const int S_OK = 0;
Make My Manifest (MMM) - отличный инструмент для этого. Также можно написать скрипт для обработки всех ваших файлов DLL / OCX с помощью mt.exe , чтобы сгенерировать манифест для каждого из них, а затем объединить их все вместе. MMM обычно лучше / проще, потому что он также обрабатывает множество особых / странных случаев.
Вы можете использовать Unattended Make My Manifest , чтобы генерировать манифесты непосредственно в автоматических сборках. Он использует файл сценария для добавления зависимых компонентов COM. Это выдержка из образца ini с доступными командами:
# Unattended MMM script
#
# Command names are case-insensitive. Reference of supported commands:
#
# Command: Identity
#
# Appends assemblyIdentity and description tags.
#
# Parameters <exe_file> [name] [description]
# exe_file file name can be quoted if containing spaces. The containing folder
# of the executable sets base path for relative file names
# name (optional) assembly name. Defaults to MyAssembly
# description (optional) description of assembly
#
# Command: Dependency
#
# Appends dependency tag for referencing dependent assemblies like Common Controls 6.0,
# VC run-time or MFC
#
# Parameters {<lib_name>|<assembly_file>} [version] [/update]
# lib_name one of { comctl, vc90crt, vc90mfc }
# assembly_file file name of .NET DLL exporting COM classes
# version (optional) required assembly version. Multiple version of vc90crt can
# be required by a single manifest
# /update (optional) updates assembly_file assembly manifest. Spawns mt.exe
#
# Command: File
#
# Appends file tag and collects information about coclasses and interfaces exposed by
# the referenced COM component typelib.
#
# Parameters <file_name> [interfaces]
# file_name file containing typelib. Can be relative to base path
# interfaces (optional) pipe (|) separated interfaces with or w/o leading
# underscore
#
# Command: Interface
#
# Appends comInterfaceExternalProxyStub tag for inter-thread marshaling of interfaces
#
# Parameters <file_name> <interfaces>
# file_name file containing typelib. Can be relative to base path
# interfaces pipe (|) separated interfaces with or w/o leading underscore
#
# Command: TrustInfo
#
# Appends trustInfo tag for UAC user-rights elevation on Vista and above
#
# Parameters [level] [uiaccess]
# level (optional) one of { 1, 2, 3 } corresponding to { asInvoker,
# highestAvailable, requireAdministrator }. Default is 1
# uiaccess (optional) true/false or 0/1. Allows application to gain access to
# the protected system UI. Default is 0
#
# Command: DpiAware
#
# Appends dpiAware tag for custom DPI aware applications
#
# Parameters [on_off]
# on_off (optional) true/false or 0/1. Default is 0
#
# Command: SupportedOS
#
# Appends supportedOS tag
#
# Parameters <os_type>
# os_type one of { vista, win7 }. Multiple OSes can be supported by a single
# manifest
#