Interop dll是什么?

61
我需要一些澄清。我有一个使用Crystal Reports的Reportwriter dll,它是用VB6编写的。我必须将此dll添加到我的asp.net项目中,其中它创建了一个Interop dll。
据我理解,Interop dll是作为中介存在的,以便我的.net代码可以与Reportwriter dll交流。
那么,我应该注册Interop dll还是原始dll?

2
+1 我认为这是一个很好的问题,即使没有人投票给你。 :) - Dusty
4个回答

97
当您在VB6中编写代码时,编译后的结果是一个COM组件。COM组件提供接口、coclasses、structs和enums,通常使用COM类型库来描述。但是,要在.NET中使用该COM组件,您需要以.NET理解的格式获得类型描述 - 即,.NET程序集(因为它不能直接使用类型库)。因此,Interop程序集只是一个“转换”的COM类型库,它包含与类型库中相应的接口、struct等对应的接口、struct等的描述。
(上述内容略有简化,因为Interop程序集不必从类型库生成-例如,如果您想要,可以手动编写一个。)
与经常说的相反,Interop程序集不包含任何可执行代码,并且不执行任何编组操作。它仅包含类型定义,而唯一可以具有方法的位置是在接口中,而在接口中的方法没有实现。将.NET调用编组到COM调用实际上是由CLR本身完成的,基于从Interop程序集加载的类型描述-它会即时生成所有必要的代码。
现在针对您的问题。您需要注册COM DLL(您的VB6输出)项目-例如,使用regsvr32.exe。您不应该(事实上,您无法)以这种方式注册Interop程序集,因为它不是COM组件-它只是普通的.NET程序集,因此您可以将其放入与您的.exe/.dll相同的文件夹中,或者像往常一样将其放入GAC。

那么,当我从我的.NET代码调用其方法时,Interop如何知道报告dll的位置在哪里?Interop是否会翻译注册表中的键? - Prabu
1
当您注册COM组件时,其位置将记录在注册表中,并且如果已知组件的GUID,则可以从那里检索。Interop程序集知道生成它的类型库的GUID,以及该类型库中所有类型的GUID - 它们存储为.NET属性。然后运行时将使用此信息通过注册表解析COM组件。 - Pavel Minaev

8

2

您是正确的。Interop DLL将对VB6组件的调用进行包装,并使其透明化。

当在执行应用程序的机器上注册DLL时,仍需要注册VB6 DLL。Interop DLL将位于应用程序的bin文件夹中,并执行调用。


2

您应该在.NET项目中注册您的VB6 dll并引用它;该引用将创建您的Interop.dll


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接