关于C#编写的COM调用问题

时间:2022-08-31 09:15:32
用C#做了一个COM供别人调用。自己测试的时候用C#调用却出现点问题。。
源码如下。

COM端:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.IO;

namespace UnPremWordCom
{
    class UnPremWordCom
    {
    }
    [Guid("805699cb-d0a2-4004-a45d-7a368cba3cf6")]
    public interface UnPremInterface
    {
        [DispId(1)]
        int UnPrem(string path);
    }
    [Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"),
    ClassInterface(ClassInterfaceType.None),
    public class UnPremService : UnPremInterface
    {
        public UnPremService()
        {
        }
        public int UnPrem(string path)
        {
           .................
           .................
           return 0;
        }
    }
}




调用端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace testcom
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        [DllImport("UnPremWordCom.dll")]
        public static extern int UnPrem(string path);
        
        private void Form1_Load(object sender, EventArgs e)
        {
           MessageBox.Show(UnPrem("aaa").ToString());
          
        }
    }
}



编译,运行都正常。COM也正常注册。
但是运行测试的时候说在DLL里找不到名为UnPrem的入口点。
因为这个东西是给C++和JAVA调用的。
我手头也没有环境。
只能拿C#测试。

请教是程序出问题还是环境出问题。。
或者请谁有其它环境的,帮我测试一下。
多谢。

12 个解决方案

#1


对了。补充一下。
这个编译好的COM在添加引用的COM选项卡里可以看到。
但是引用会出错。

the activex type library  xxxxxx  was exported from a .net assembly and cannot be added as a reference.

add a reference to the .net assembly instead

#2


该回复于2010-12-02 16:04:08被版主删除

#3


顶起 求解。

#4


搞定了。代码没问题~~~
VC6导tlb运行
C#引用DLL

#5


我也搞过一段时间。但是后来机器死掉了。我的心血就....... 唉....

#6


来晚了……555 关于C#编写的COM调用问题

#7


该回复于2010-12-02 15:48:30被版主删除

#8


该回复于2010-12-02 15:48:30被版主删除

#9


控件最好还是别用C#写,最好是用VC++.NEt

#10


该回复于2010-12-30 10:25:51被版主删除

#11


Interface和class都要加上 [ComVisible(true)],公开的方法也要加上[ComVisible(true)]

例如:


sing System.IO;
using System.Runtime.InteropServices;


namespace MyDLL_COM
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]   
    public class Directory4COM
    {
        [ComVisible(false)]
        public int Add(int a, int b)
        {
            return a + b;
        }

        [ComVisible(true)]
        public string[] GetAllFiles(string directory)
        {
            return Directory.GetFiles(directory);
        }

        public bool IsExistsDir(string directory)
        {
            return Directory.Exists(directory);
        }
    }

    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [ComVisible(true)]
    public interface IDirectory4COM
    {
        string[] GetAllFiles(string directory);
        bool IsExistsDir(string directory);
    }

    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces((typeof(IDirectory4COM)))]
    [ComVisible(true)]
    public class Directory4COM2 : IDirectory4COM
    {
        [ComVisible(true)]
        public string[] GetAllFiles(string directory)
        {
            return Directory.GetFiles(directory);
        }

        [ComVisible(true)]
        public bool IsExistsDir(string directory)
        {
            return Directory.Exists(directory);
        }
    }
}

#12


该回复于2010-12-02 16:04:06被版主删除

#1


对了。补充一下。
这个编译好的COM在添加引用的COM选项卡里可以看到。
但是引用会出错。

the activex type library  xxxxxx  was exported from a .net assembly and cannot be added as a reference.

add a reference to the .net assembly instead

#2


该回复于2010-12-02 16:04:08被版主删除

#3


顶起 求解。

#4


搞定了。代码没问题~~~
VC6导tlb运行
C#引用DLL

#5


我也搞过一段时间。但是后来机器死掉了。我的心血就....... 唉....

#6


来晚了……555 关于C#编写的COM调用问题

#7


该回复于2010-12-02 15:48:30被版主删除

#8


该回复于2010-12-02 15:48:30被版主删除

#9


控件最好还是别用C#写,最好是用VC++.NEt

#10


该回复于2010-12-30 10:25:51被版主删除

#11


Interface和class都要加上 [ComVisible(true)],公开的方法也要加上[ComVisible(true)]

例如:


sing System.IO;
using System.Runtime.InteropServices;


namespace MyDLL_COM
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]   
    public class Directory4COM
    {
        [ComVisible(false)]
        public int Add(int a, int b)
        {
            return a + b;
        }

        [ComVisible(true)]
        public string[] GetAllFiles(string directory)
        {
            return Directory.GetFiles(directory);
        }

        public bool IsExistsDir(string directory)
        {
            return Directory.Exists(directory);
        }
    }

    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [ComVisible(true)]
    public interface IDirectory4COM
    {
        string[] GetAllFiles(string directory);
        bool IsExistsDir(string directory);
    }

    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces((typeof(IDirectory4COM)))]
    [ComVisible(true)]
    public class Directory4COM2 : IDirectory4COM
    {
        [ComVisible(true)]
        public string[] GetAllFiles(string directory)
        {
            return Directory.GetFiles(directory);
        }

        [ComVisible(true)]
        public bool IsExistsDir(string directory)
        {
            return Directory.Exists(directory);
        }
    }
}

#12


该回复于2010-12-02 16:04:06被版主删除