使用C#动态引用COM dll



我的C#应用程序将使用第三方C#COM dll。我想以最漂亮的方式调用该dll的所有成员,比如在将该dll添加到项目引用和">使用"之后陈述但从另一方面来说,我想确定dll是否不存在于系统中,并从我的应用程序中显示异常(就像我可以使用后期绑定一样)。那么,我如何才能找到缺少的dll,并使用这个dll,VisualStudio将在使用语句后看到该dll喜欢的所有类型?

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

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

因此,实际实例化的不是实际的COM对象,而是作为这些COM对象的某种代理的.NET对象。在内部,它们为您调用CoCreateInstanceCoCreateInstanceEx以及COM类工厂。它们还管理这些对象的内存处理。(您可以使用Marshal.ReleaseComObject来影响此管理,但您应该注意到这可能很危险)。

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

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

最好的方法是将您的应用程序与自己安装库的第三方可再分发包一起交付。这也确保了其他应用程序不会删除第三方类型库。这就是微软使用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对象,所以操作系统版本无关紧要。

最新更新