[英]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必須具有PE
或COFF
標頭,而.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.