我写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. [签名]
右击项目->属性->[签名]标签, 选中[为程序集签名]–>[选择强名称密钥文件]–>[新建],输入你的密钥名称,去掉[使用密码保护密钥文件]
- 生成的时候自动注册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(); // 这个只是预览一下