繁体   English   中英

使用C#动态引用COM dll

[英]Dynamically refer to COM dll using C#

我的C#应用​​程序将使用第三方C#COM dll。 我想以最漂亮的方式调用该dll的所有成员-像在将该dll添加到项目引用和“ using ”语句之后一样。 但是从另一方面,我想确定系统中是否不存在dll并显示我的应用程序中的异常(例如我可以使用后期绑定)。 因此,如何才能捕获缺少的dll,并在使用语句后使用 Visual Studio将看到该dll的所有类型的该dll?

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

Visual Studio会为您生成一个所谓的Interop-Library。 这意味着,如果您引用的库名为MyCOMLib.dll ,它将生成一个名为MyComLib.Interop.dll的程序集。 ) you are instancing from your .NET application. 该程序集包含您要从.NET应用程序实例化的.NET包装器对象(所谓的 )。 您可以使用TlbImp.exe -Tool自行生成此互操作库。

因此,您实际上要实例化的不是实际的COM对象,而是充当这些COM对象的某种代理的.NET对象。 在内部,他们正在为您调用CoCreateInstanceCoCreateInstanceEx和COM类工厂。 他们还管理那些对象的内存处理。 (您可以使用Marshal.ReleaseComObject对此管理产生影响,但您应该注意这可能很危险 )。

这意味着您的应用程序确实始终与这些互操作程序集一起提供。 如果这些程序集不存在(并且您已经使用Project References引用了它们),则该应用程序将无法运行(启动时将引发异常)。 如果程序集可以加载到应用程序的AppDomain中 ,则在创建互操作类型对象之前不会有问题。 RCW与CLSID一起调用CoCreateInstance / CoCreateInstanceEx (互操作程序集通过TlbImp.exe工具而知道)。 如果在注册表中找不到这些类ID,则您的应用程序将抛出运行时异常。

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

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

我想最好的方法是从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对象一起使用,因此OS版本无关紧要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM