.net编写com组件的注意事项

我写com组件是基于这篇文章来的.

http://www.cnblogs.com/eric_ibm/archive/2012/07/06/dll.html

自己开发机上, pb可以正常调用成功.
但是发到其它机器上, 任何一个函数都调用失败…
貌似是组件注册失败了, 或者开发环境上面vs生成的时候自动给注册了.

经过一番考察最后终于知道了.原因

原来是 regasm.exe 命令要求, 如果不是全局程序集里面的类, 那么要加个参数 /codebase

/codebase
 在注册表中创建一个 Codebase 项。Codebase 项指定未安装到全局程序集缓存中的程序集的文件路径。如果随后要安装正在注册到全局程序集缓存中的程序集,则不应指定此选项。用 /codebase 选项指定的 assemblyFile 参数必须是具有强名称的程序集。

强名称的程序集 也就是签名的程序集, 这个很简单.在右击项目->属性->签名->勾上为程序签名-> 点击下拉框-> 新建-> 密钥文件名随便输入一个名字. 密码不填也可以. 然后确定.
这样程序就是强名称的程序集了.

我在项目里面加了一个bat文件. 文件内容如下.

c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe MakeReport.dll /tlb:MakeReport.tlb /codebase
pause

**

总结一下开发步骤

**
1.要开启Com模式 使程序集COM可见
右击项目->属性->[应用程序]标签-> 点击程序集信息按钮,弹出信息窗口,选中[使程序集COM可见]
2. [签名]
右击项目->属性->[签名]标签, 选中[为程序集签名]–>[选择强名称密钥文件]–>[新建],输入你的密钥名称,去掉[使用密码保护密钥文件]

  1. 生成的时候自动注册COM控件, (这一步可有可无)
    这个是为了方便开发自动注册用的,如果你用批处理不设置这一步也可以. 方法是 右击项目->属性-> [生成]标签 ,选中[为COM互操作注册]

4.代码里别忘了
[ComVisible(true)]
[Guid(“8B82ABE3-28F6-4D99-8618-09BA41467BC9”)]
[ComSourceInterfaces(typeof(IMakeReport))]
[ClassInterface(ClassInterfaceType.None)]
[DispId(1)]
我的代码如下

using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.IO;
using System.Net;
//using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
//using System.Threading.Tasks;

namespace MK
{
    [ComVisible(true)]
    [Guid("8B82ABE3-28F6-4D99-8618-09BA41467BC9")] 
    public interface IMakeReport
    {
        [DispId(1)]
         void SetReportServerUrl(string url);
        [DispId(2)]
        void SetReportPath(string path);  //
    }

    [ComVisible(true)]
    [Guid("EA9E240A-1631-4710-A447-559467784F37")] 
    [ComSourceInterfaces(typeof(IMakeReport))] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class MakeReport : IMakeReport
    {
        public string ReportPath { get;  set; }
    
        public Uri ReportServerUrl { get;  set; }
        /// <summary>
        /// 设置报告单的服务器路径
        /// </summary>
        /// <param name="url"></param>
        public void SetReportServerUrl(string url)
        { 
            ReportServerUrl = new System.Uri(url);
        }
        
        /// <summary>
        /// 设置报告单的路径
        /// </summary>
        /// <param name="path"></param>
        public void SetReportPath(string path)
        {
            ReportPath = path;
        }

     }
 }

**

最重要的签名,并且注册脚本中要有参数/codebase

最重要的签名,并且注册脚本中要有参数/codebase

最重要的签名,并且注册脚本中要有参数/codebase

最重要的签名,并且注册脚本中要有参数/codebase

**
增加手动注册脚本文件. 我的是 [注册.bat]
内容如下,

c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe MakeReport.dll /tlb:MakeReport.tlb /codebase
pause

PB调用方的代码非常简单

OLEObject encryption
 
encryption = Create OLEObject
encryption.ConnectToNewObject("MK.MakeReport")//MK是命名空间, MakeReport 是类名.

encryption.SetReportServerUrl("http://192.168.12.111:8099/ReportServer");
encryption.SetReportPath("/Report Parts/Report1"); 

//encryption.PrintPreview(); // 这个只是预览一下
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值