2008-10-14 25 views
1

我已经继承了一个.NET应用程序,它将两个团队构建的100个DLL合并在一起,或者从供应商处购买。我想快速确定一个给定的dll是一个.NET程序集还是一个COM组件。我意识到我可以在每个dll上单独调用ildasm,并且在dll没有有效的CLR头部时做一个记录,但是这种方法看起来笨拙而且很难自动化。在.NET应用程序中识别COM组件

回答

3

如果您想从COM端接近,则在DLL中测试COM对象归结为查找名为“DllGetClassObject”的导出。这是因为COM运行时通过调用该DLL上的DllGetClassObject()来访问进程内COM对象。

你可以使用DUMPBIN.EXE一个批处理文件,它附带了Visual Studio的具体步骤如下:

dumpbin unknown.dll /exports | find "DllGetClassObject" 

上面的命令行会产生一个文本行,如果它是一个包含COM对象的非托管DLL,否则输出零字节。

您可以通过加载每个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

您可以随时尝试将“Assembly Version”列添加到资源管理器窗口中,并注意哪些元素为空以查找非.NET程序集。

0
System.Reflection.Assembly.ReflectionOnlyLoadFrom("mydll.dll") 

将返回一个有效的.NET DLL的程序集引用,但会为COM DLL引发错误。

相关问题