我需要澄清一下.我有一个Reportwriter dll,它使用Crystal Reports.它是用VB6编写的.我必须将这个dll添加到我的asp.net项目,它在其中创建一个互操作dll.
据我所知,interop dll是作为中介存在的,因此我的.net代码可以与Reportwriter dll对话.
那么,我是注册互操作DLL还是注册原始DLL呢?
我需要澄清一下.我有一个Reportwriter dll,它使用Crystal Reports.它是用VB6编写的.我必须将这个dll添加到我的asp.net项目,它在其中创建一个互操作dll.
据我所知,interop dll是作为中介存在的,因此我的.net代码可以与Reportwriter dll对话.
那么,我是注册互操作DLL还是注册原始DLL呢?
当您用VB6编写代码时,编译结果是COM组件.COM组件提供通常使用COM类型库描述的接口、coclass、 struct 和枚举.但是,要在.NET中使用COM组件,您需要使用.NET能够理解格式的类型描述-即.NET程序集(因为它不能直接使用类型库).因此,互操作程序集只是一个"转换"的COM类型库,从某种意义上说,它包含与类型库中的相同内容相对应的接口、 struct 等的描述.
(上面稍微简化了一些,因为互操作程序集不是从类型库生成的-例如,如果需要,您可以手动编写一个.)
与通常所说的相反,互操作程序集不包含任何可执行代码,也不进行任何编组.它只包含类型定义,唯一可以包含方法的地方是在接口中,而接口中的方法没有实现.编组.NET对COM ones的调用实际上是由CLR本身根据从互操作程序集加载的类型描述完成的——它会动态生成所有必要的代码.
现在谈到你的问题.您需要注册COM DLL(VB6的输出)项目-例如,使用regsvr32.exe
.您不应该(实际上,您不能)以这种方式注册互操作程序集,因为它不是COM组件-它只是一个普通的.NET程序集,因此您可以将其与.exe/.dll放在同一文件夹中,也可以像往常一样将其放入GAC中.