新建类库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程序集?

解决方案 »

  1.   

    你可以注册到系统,做为全局Com组件试试?
    不行试试百度吧....呵呵~~
    [align=center]*********************************************************** 
                       欢迎使用 CSDN 小秘书
                      .Net 学习QQ群,欢迎加入: 67784580
    ***********************************************************
    [/align]
      

  2.   

    貌似托管的不好用 注册成全局的试试吧 只用C#调过VC  DELPHI  VB的`还真没有拿别的语言调过C#的
      

  3.   

    C#调用C#写的COM, 添加COM引用之后, 就像可以了
      

  4.   

    多此一举,.net开发的程序集和C++之间是要靠平台调用来工作的,而.net程序集之间则可以直接调用。
    如果真要这么干,你得使用Activator.CreateInstance来创建这个实例,或许能达到你的目的。
      

  5.   

    .NET client 无法使用.NET注册的COM server.你应当直接添加对assembly的引用.
      

  6.   

    搞定:
    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安装在系统目录等固定位置。