什么是interop dll?

我需要一些澄清。 我有一个使用Crystal Reports的Reportwriter DLL。 它是用VB6编写的。 我必须添加这个DLL到我的asp.net项目,在那里它创build一个互操作的DLL。

据我了解,互操作DLL是作为一个中介,以便我的.net代码可以对报告的作者DLL说话。

那么我注册互操作的DLL或注册原来的DLL?

当你在VB6中编写代码时,编译结果是一个COM组件。 COM组件提供接口,coclasses,结构和枚举,通常使用COMtypes库进行描述。 但是,为了在.NET中使用COM组件,需要使用.NET可以理解的格式(即.NET程序集(因为它不能直接与types库一起工作))进行types描述。 因此,互操作程序集只是一个“转换的”COMtypes库,从某种意义上说,它包含了对应于types库中相同事物的接口,结构等的描述。

(上面的内容有些简单,因为互操作程序集不需要从types库中生成,例如,如果需要,可以手动编写一个)。

与通常所说的相反,互操作程序集不包含任何可执行代码,并且不进行任何编组。 它只包含types定义,唯一可以有方法的地方是接口,接口中的方法没有实现。 对.NET调用.NET的调用实际上是由CLR本身根据从互操作程序集加载的types描述完成的 – 它会即时生成所有必要的代码。

至于你的问题。 您需要注册您的COM DLL(您的VB6的输出)项目 – 例如,使用regsvr32.exe 。 你不应该(事实上你不能)以这种方式注册一个互操作程序集,因为它不是一个COM组件 – 它只是一个普通的.NET程序集,所以你可以把它放在与你的.exe / .dll相同的文件夹中,或像平常一样把它放进GAC。

帕维尔的好回答。 另外,从.NET Framework第4版开始,您不需要在应用程序中部署interop程序集: http://msdn.microsoft.com/zh-cn/library/tc0204w0.aspx

你是对的 interop DLL将调用包装到VB6组件,并使它们透明。

在机器上注册DLL时,您将执行应用程序,您仍然需要注册VB6 DLL。 互操作DLL将坐在你的应用程序的bin文件夹中,并将调用封装出来。

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