我已经继承了一个.NET应用程序,它将两个团队构建的100个DLL合并在一起,或者从供应商处购买。我想快速确定一个给定的dll是一个.NET程序集还是一个COM组件。我意识到我可以在每个dll上单独调用ildasm,并且在dll没有有效的CLR头部时做一个记录,但是这种方法看起来笨拙而且很难自动化。在.NET应用程序中识别COM组件
1
A
回答
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引发错误。
相关问题
- 1. 如何分发使用COM组件的.NET应用程序?
- 2. 从C#应用程序调用本地.NET(2)COM +组件
- 3. 用应用程序识别文件
- 4. .NET应用程序中的COM控件中的AccessViolationException
- 5. 语音识别应用程序在c#.net
- 6. .NET使用VB6 COM组件
- 7. 使用IronPython在NET中打开COM应用程序
- 8. 在.NET应用程序中使用免费的注册com
- 9. 在.net应用程序中使用Interop时获取COM异常
- 10. 在.NET程序集中个人识别(程序员的)信息
- 11. 从Android应用程序中识别GoogleTv
- 12. 如何以编程方式从COM +应用程序中删除COM +组件
- 13. 引用第三方程序集的COM +(.NET)应用程序
- 14. asp .net MVC应用程序不识别[Key,Column(Order = 0)]属性
- 15. 使现有的.NET Windows应用程序能够识别DPI
- 16. 在VS .NET 2003中识别线程
- 17. 通过COM互操作访问的.net组件的应用程序域行为
- 18. 实时升级.NET应用程序中使用的COM对象
- 19. 分析从.NET应用程序中使用的COM库
- 20. 将COM组件嵌入到AIR应用程序中?
- 21. 调试.NET COM组件
- 22. VBA应用程序可以通过COM在.NET类库中监听事件吗?
- 23. Heroku将Django应用程序识别为Node应用程序
- 24. 识别我的应用程序上的其他应用程序
- 25. 应用程序引擎应用程序标识符别名
- 26. Heroku应用程序未被识别为播放应用程序
- 27. 从我的.NET应用程序调用现有Com应用程序的方法
- 28. 打开一个文件,一个.net应用程序会识别它?
- 29. 创建语音识别应用程序
- 30. iPhone应用程序 - 咖啡杯识别