我需要澄清一下.我有一个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中.

Asp.net相关问答推荐

Razor 页面客户端站点验证不起作用

在具有多个项目(API/服务/数据等)的解决方案中编写 SignalR 服务的最佳方法是什么?

检测 ASP.NET 中的内存泄漏

Server.Transfer 在执行子请求时抛出错误.如何解决?

Directory.Exists 不适用于网络路径

如何在 ASP.NET 下拉列表中添加选项组?

在不知道键名的情况下访问 JSON 对象的元素

尽管安装了 AspNetCoreModule,但在 IIS 中运行 ASP.NET Core 应用程序时出现 0x8007000d 错误 500.19

如何从 SQL Server 2008 本身获取客户端 IP 地址?

DBContext.Entry 有什么作用?

使用 LINQ 进行递归控制搜索

存在 ios 7 虚拟键盘时,div 元素不会停留在底部

如何在 ASP.NET 站点中添加 favicon.ico

如何在 ASP.net 中使用 wkhtmltopdf.exe

如何在 ASP.NET MVC 中启用跨源请求

@(at) 登录文件路径/字符串

.NET AJAX 调用 ASMX 或 ASPX 或 ASHX?

HttpContext.Current.Request.Url.Host 它返回什么?

ASP.NET 按钮重定向到另一个页面

使用 FileUpload Control 获取文件的完整路径