我已經繼承了一個.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應用程序 - 咖啡杯識別