簡體   English   中英

在批處理文件中從.NET程序集區分COM dll

[英]Distinguish COM dll from .NET assembly in batch files

我在文件夾中有一堆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程序集,它會失敗。 作為一種解決方法,我可以用regasm替換regsvr32並再次運行它。 在第二次運行中,這將注冊.NET程序集。 我想知道,是否有一種方法可以使批處理文件在這里區分這兩種情況。 我了解,COM dll必須具有PECOFF標頭,而.NET程序集則不能(?)。 看一下MSDN,我看到了ImageHlp API,它可能對此有所幫助。 有沒有更簡單的方法可以達到相同目的?

我相當確定您無法使用原始批處理腳本來檢測到這一點。 (或者,如果您能找到一種方法,那么它將變得非常丑陋。)但是您可以通過其他多種方法來執行此操作。

這是一個選項:使用Windows SDK附帶的corflags.exe 要在系統上查找副本,請嘗試使用諸如attrib /s C:\\corflags.exe 要使用它,請嘗試如下操作:

corflags.exe your.dll
if %ERRORLEVEL% equ 0 goto :IS_DOT_NET
goto :IS_NOT_DOT_NET

或者,您可以編寫自己的程序,以尋找DLL中是否存在DllRegisterServer入口點,而.NET DLL沒有該入口點。 只需使用任何一種語言的幾行代碼即可進行此檢查。 這是C ++:

// 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已經完成的工作的一半,因此您可以執行以下操作:

regsvr32.exe /s your.dll
if %errorlevel% neq 0 regasm.exe your.dll

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM