在批处理文件中从.NET程序集区分COM dll

时间:2018-11-06 14:19:07

标签: .net batch-file com regsvr32 regasm

我的文件夹中有一堆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必须具有PECOFF头,而.NET程序集不能(?)。在MSDN上,我看到ImageHlp API可能对此有所帮助。有没有更简单的方法可以达到相同的目的?

1 个答案:

答案 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