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

abc3316 2010-11-17 05:18:47
用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#测试。

请教是程序出问题还是环境出问题。。
或者请谁有其它环境的,帮我测试一下。
多谢。
...全文
214 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
机器人 2010-11-18
  • 打赏
  • 举报
回复
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);
}
}
}
int64 2010-11-18
  • 打赏
  • 举报
回复
控件最好还是别用C#写,最好是用VC++.NEt
三岁、就很帅 2010-11-18
  • 打赏
  • 举报
回复
来晚了……555
Dogfish 2010-11-18
  • 打赏
  • 举报
回复
我也搞过一段时间。但是后来机器死掉了。我的心血就....... 唉....
abc3316 2010-11-17
  • 打赏
  • 举报
回复
搞定了。代码没问题~~~
VC6导tlb运行
C#引用DLL
abc3316 2010-11-17
  • 打赏
  • 举报
回复
顶起 求解。
abc3316 2010-11-17
  • 打赏
  • 举报
回复
对了。补充一下。
这个编译好的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

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧