Определение компонентов COM в приложении .NET - PullRequest
1 голос
/ 14 октября 2008

Я унаследовал приложение .NET, которое собирает около 100 библиотек, созданных двумя командами или приобретенных у поставщиков. Я хотел бы быстро определить, является ли данная DLL сборка .NET или COM-компонент. Я понимаю, что мог бы просто вызывать ildasm для каждого dll отдельно и сделать заметку, если dll не имеет действительного заголовка CLR, но этот подход кажется неуклюжим и его трудно автоматизировать.

Ответы [ 3 ]

3 голосов
/ 15 октября 2008

Если вы хотите подойти со стороны COM, тестирование COM-объектов в DLL сводится к поиску экспорта с именем "DllGetClassObject". Это связано с тем, что доступ к COM-объекту внутри процесса осуществляется из среды выполнения COM путем вызова DllGetClassObject () для этой DLL.

Вы можете сделать это из командного файла, используя DUMPBIN.EXE , который поставляется с Visual Studio следующим образом:

dumpbin unknown.dll /exports | find "DllGetClassObject"

Приведенная выше командная строка выдаст одну строку текста, если это неуправляемая DLL, которая содержит COM-объекты, или ноль байтов вывода в противном случае.

Вы можете сделать это программно, загрузив каждую DLL и попытаться выполнить GetProcAddress () в этой точке входа. Вот проверенная и работающая программа командной строки C #, которая использует эту технику:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

static class NativeStuff
{
    [DllImport("kernel32.dll")]
    public static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("kernel32.dll")]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

    [DllImport("kernel32.dll")]
    public static extern bool FreeLibrary(IntPtr hModule);
}

namespace IsComDLL
{
    class Program
    {
        static void Main(string[] args)
        {
            if ( (args.Length == 0 ) || String.IsNullOrEmpty( args[0] ) )
            {
                Console.WriteLine( "Give DLL name on command line" );
                Environment.Exit(255);
            }

            IntPtr pDll = NativeStuff.LoadLibrary(args[0]);
            if ( pDll == IntPtr.Zero )
            {
                Console.WriteLine( "DLL file {0} not found", args[0] );
                Environment.Exit(256);
            }

            IntPtr pFunction = NativeStuff.GetProcAddress(pDll, "DllGetClassObject");
            int exitValue = 0;
            if (pFunction == IntPtr.Zero)
            {
                Console.WriteLine("DLL file {0} does NOT contain COM objects", args[0]);
            }
            else
            {
                Console.WriteLine("DLL file {0} does contain COM objects", args[0]);
                exitValue = 1;
            }

            NativeStuff.FreeLibrary(pDll);

            Environment.Exit(exitValue);
        }
    }
}
3 голосов
/ 14 октября 2008

Вы всегда можете попытаться добавить столбец «Версия сборки» в окно проводника и указать, какие из них пустые, чтобы найти сборки, отличные от .NET.

0 голосов
/ 14 октября 2008
System.Reflection.Assembly.ReflectionOnlyLoadFrom("mydll.dll")

вернет действительную ссылку на сборку для DLL-библиотеки .NET, но выдаст ошибку для COM-библиотеки DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...