源码如下。
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
这个编译好的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
#3
顶起 求解。
#4
搞定了。代码没问题~~~
VC6导tlb运行
C#引用DLL
VC6导tlb运行
C#引用DLL
#5
我也搞过一段时间。但是后来机器死掉了。我的心血就....... 唉....
#6
来晚了……555
#7
#8
#9
控件最好还是别用C#写,最好是用VC++.NEt
#10
#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
#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
这个编译好的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
#3
顶起 求解。
#4
搞定了。代码没问题~~~
VC6导tlb运行
C#引用DLL
VC6导tlb运行
C#引用DLL
#5
我也搞过一段时间。但是后来机器死掉了。我的心血就....... 唉....
#6
来晚了……555
#7
#8
#9
控件最好还是别用C#写,最好是用VC++.NEt
#10
#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);
}
}
}