新建类库CSharp - 项目属性 - 生成 - 勾选“为 COM Interop 注册”
添加引用“System.Windows.Forms”
Class1.cs代码如下:using System;
using System.Runtime.InteropServices;namespace CSharp
{
[ComVisible(true)]
public class Class1 : IClass1
{
public void Hello()
{
System.Windows.Forms.MessageBox.Show("Hello");
}
}
[ComVisible(true)]
public interface IClass1
{
void Hello();
}
}
编译后用VC调用如下:#include <stdio.h>#import "CSharp.tlb"
using namespace CSharp;void main()
{
CoInitialize(NULL);
IClass1Ptr p(__uuidof(Class1));
p->Hello();
CoUninitialize();
}成功,没有问题。
可是在C#工程中引用COM组件CSharp时弹出以下错误:
ActiveX 类型库...\CSharp.tlb是从 .NET程序集导出的,无法将其作为引用添加。
请问:应该怎么设置才能添加此COM组件,而不是引用.NET程序集?
添加引用“System.Windows.Forms”
Class1.cs代码如下:using System;
using System.Runtime.InteropServices;namespace CSharp
{
[ComVisible(true)]
public class Class1 : IClass1
{
public void Hello()
{
System.Windows.Forms.MessageBox.Show("Hello");
}
}
[ComVisible(true)]
public interface IClass1
{
void Hello();
}
}
编译后用VC调用如下:#include <stdio.h>#import "CSharp.tlb"
using namespace CSharp;void main()
{
CoInitialize(NULL);
IClass1Ptr p(__uuidof(Class1));
p->Hello();
CoUninitialize();
}成功,没有问题。
可是在C#工程中引用COM组件CSharp时弹出以下错误:
ActiveX 类型库...\CSharp.tlb是从 .NET程序集导出的,无法将其作为引用添加。
请问:应该怎么设置才能添加此COM组件,而不是引用.NET程序集?
解决方案 »
- 两个List<int> ,不考虑顺序的按值比较是否相等。最快最简单的方法是什么?
- 请问如何从RS232/USB端读出仪器传来的数据,并转为SQL数据
- 竟然说'Data'不在 namespace 'System' 下?????
- 绘图问题e.Graphics.DrawLine()方法不能理解;
- 如何把一个.NET的DLL用命令行正确注册为COM的DLL库呢?
- C#里的Socket的同步接收怎么Receive怎么设置超时?
- C#工具条的button怎样给他添加快捷键?
- VB窗口句柄和C#窗口句柄的区别,请大家帮我分析一下!
- 周期性触发事件
- 关于linq
- webBrowser中如何关闭弹出的javascript对话框
- -=是什么意思
不行试试百度吧....呵呵~~
[align=center]***********************************************************
欢迎使用 CSDN 小秘书
.Net 学习QQ群,欢迎加入: 67784580
***********************************************************
[/align]
如果真要这么干,你得使用Activator.CreateInstance来创建这个实例,或许能达到你的目的。
public static void Main(string[] args)
{
Type tpyeCSharp_Class1 = Type.GetTypeFromProgID("CSharp.Class1");
if (tpyeCSharp_Class1 == null) return;
object CSharp_Class1 = Activator.CreateInstance(tpyeCSharp_Class1);
tpyeCSharp_Class1.InvokeMember("Hello", System.Reflection.BindingFlags.InvokeMethod, null, CSharp_Class1, null);
}参考:http://blog.csdn.net/dead_of_winter/archive/2008/03/26/2221503.aspxPS:这不是多此一举,如果程序p1安装了此COM,p2则不需要包含此dll
如果按照普通类库的方式引用,则p2必须包含此dll,除非dll安装在系统目录等固定位置。