使用C#动态引用COM dll

时间:2012-12-04 09:34:29

标签: c# .net dll com

我的C#应用​​程序将使用第三方C#COM dll。我希望以最美丽的方式调用该dll的所有成员 - 比如将此dll添加到项目引用和“使用”之后 声明。但是从另一方面我想确定dll是否不存在于系统中并显示我的应用程序的异常(就像我可以使用后期绑定)。那么我怎么能抓住dll,并使用这个dll,VisualStudio会在使用语句之后看到所有类型的dll?

Com dll正在使用regasm.exe进行注册。该工具还可以从dll生成.tlb文件。也许我可以用某种方式使用这个.tlb?

2 个答案:

答案 0 :(得分:1)

Visual Studio为您生成所谓的Interop-Library。这意味着如果您引用一个名为MyCOMLib.dll的库,它将生成一个名为MyComLib.Interop.dll的程序集。此程序集包含.NET包装器对象(所谓的运行时可调用包装程序),您正在从.NET应用程序进行实例化。您可以使用TlbImp.exe - 工具自行生成此互操作库。

因此,您实际实例化的不是实际的COM对象,而是.NET对象,它们可以作为这些COM对象的某种代理。在内部,他们正在为您调用CoCreateInstanceCoCreateInstanceEx以及COM类工厂。他们还管理这些对象的内存处理。 (您可以使用Marshal.ReleaseComObject对此管理产生影响,但您应该notice that this can be dangerous)。

这意味着您的应用程序始终与这些互操作程序集一起发送。如果这些程序集不存在(并且您使用项目引用引用它们),则应用程序将不会运行(它将在启动时引发异常)。如果程序集可以加载到应用程序的 AppDomain ,则在创建互操作类型对象之前不会有任何问题。 RCW与CLSID一起调用CoCreateInstance / CoCreateInstanceEx(interop程序集知道感谢TlbImp.exe工具)。如果在注册表中找不到那些类ID,则应用程序将抛出运行时异常。

检查库是否存在的一种好方法是在应用程序设置期间检查唯一的库ID和版本。这些存储在注册表中。您需要知道库的GUID和版本,然后您才能在HKLM\Software\Classes\TypeLib\{Guid}\{Version}下找到它们。

最好的方法是将您的应用程序与第三方可再发行软件包一起交付,该软件包可以自行安装库。这还可以确保其他应用程序不会删除第三方类型库。这就是微软使用Visual C ++库或DirectX的方式。

答案 1 :(得分:0)

我想最好的方法是从progID获取COM对象并尝试创建它。

Type comType = Type.GetTypeFromProgID(progID);
if (comType == null)
  throw new Exception("COM object not found!);
dynamic comObject = Activbator.CreateInstance(comType);
comObject.SomeOperation();

此解决方案的附加值是,您的应用程序的一个版本将同时使用x86和x64 COM对象,因此操作系统版本无关紧要。

相关问题