我的文件夹中有一堆dll,它们是COM dlls
或.NET assemblies
。现在,我在下面使用类似这样的方法注册二进制文件:
@echo off
set argCount=0
for %%x in (%*) do (
set /A argCount+=1
)
if not %argCount% == 1 (
echo Usage:
echo %0 ^<filename^>
echo Example:
echo %0 path\to\the\file.ext
goto end
)
for /F "tokens=*" %%A in (%1) do (
echo Registering %%A ...
regsvr32 "%%A"
)
:end
这里的问题是,尽管对于COM dll,它可以正常工作,但对于.NET程序集,它会失败。作为解决方法,我可以将regsvr32
替换为regasm
并再次运行。在第二次运行中,这将注册.NET程序集。我想知道,是否有一种方法可以使批处理文件在这里区分这两种情况。我了解,COM dll必须具有PE
或COFF
头,而.NET程序集不能(?)。在MSDN上,我看到ImageHlp API可能对此有所帮助。有没有更简单的方法可以达到相同的目的?
答案 0 :(得分:1)
我相当确定您无法使用原始批处理脚本来检测到这一点。 (或者,如果您能找到一种方法,那么它将变得非常丑陋。)但是您可以通过许多其他方法来做到这一点。
这里是一个选择:使用var seasonDropdown = TVContainer.find('select.season').val();
if (seasonDropdown == "-1" || !seasonDropdown) seasonDropdown = null;
,它随Windows SDK一起提供。要在系统上查找副本,请尝试类似corflags.exe
的操作。要使用它,请尝试以下操作:
attrib /s C:\corflags.exe
或者,您可以编写您自己的程序,以寻找DLL中是否存在corflags.exe your.dll
if %ERRORLEVEL% equ 0 goto :IS_DOT_NET
goto :IS_NOT_DOT_NET
入口点,而.NET DLL没有该入口点。只需使用任何一种语言的几行代码即可进行此检查。这是C ++:
DllRegisterServer
当然,这只是// returns:
// 1 if the dll can be used with regsvr32
// 0 if the dll cannot be used with regsvr32
// -1 if the dll cannot be loaded
int main(int argc, LPCSTR* argv)
{
if (argc != 2)
return -1;
HMODULE hModule = LoadLibraryA(argv[1]);
if (!hModule)
return -1;
FARPROC dllRegisterServer = GetProcAddress(hModule, "DllRegisterServer");
FreeLibrary(hModule);
if (dllRegisterServer)
return 1;
return 0;
}
已经完成的事情的一半,因此您可以执行以下操作:
regsvr32.exe