我需要澄清一下。我有一个使用Crystal Reports的Reportwriter dll。它是用VB6编写的。我必须将这个dll添加到我的asp.net项目中,它创建一个interop dll。
根据我的理解,interop dll是作为中间人使我的.net代码可以与Reportwriter dll说话。
所以我注册了interop dll还是注册了原来的dll?
答案 0 :(得分:90)
在VB6中编写代码时,编译结果是COM组件。 COM组件提供接口,coclass,结构和枚举,通常使用COM类型库进行描述。但是,要在.NET中使用该COM组件,您需要以.NET理解的格式进行类型描述 - 即.NET程序集(因为它不能直接与类型库一起使用)。因此,互操作程序集只是一个“转换”的COM类型库,在某种意义上它包含对应于类型库中相同内容的接口,结构等的描述。
(上面的内容有些简化,因为互操作程序集不会从类型库中生成 - 例如,如果需要,可以手动编写一个。)
与常说的相反,互操作程序集不包含任何可执行代码,也不进行任何编组操作。它只包含类型定义,并且它可以拥有方法的唯一位置是接口,接口中的方法没有实现。对来自COM的Marshaling .NET调用实际上是由CLR本身根据从互操作程序集加载的类型描述完成的 - 它会动态生成所有必需的代码。
现在你的问题。您需要注册COM DLL(VB6的输出)项目 - 例如,使用regsvr32.exe
。你不应该(事实上,你不能)以这种方式注册一个互操作程序集,因为它不是一个COM组件 - 它只是一个普通的.NET程序集,所以你可以将它放在与.exe / .dll相同的文件夹中,或像往常一样把它放入GAC。
答案 1 :(得分:7)
Pavel的回答很好。此外,从.NET Framework版本4开始,您无需在应用程序中部署互操作程序集 - http://msdn.microsoft.com/en-us/library/tc0204w0.aspx
答案 2 :(得分:2)
你是对的。互操作DLL将调用包装到VB6组件并使它们透明。
在机器上注册DLL时,您将执行应用程序,您仍然需要注册VB6 DLL。互操作DLL将位于您的应用程序的bin文件夹中,并将呼出编组。
答案 3 :(得分:2)
您应该注册VB6 dll并在.NET项目中引用它;该引用将创建您的Interop.dll