我一直在研究一个易于访问的简单dll库,以便其他软件可以使用我们的库(来自任何托管或非托管语言)。
创建一个易于访问的dll非常简单:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace MyNamespace
{
//This interface defines purely the events. DotNetEventSender should implement this interface with the ComSourceInterfaces() attribute
//to become an Event Source.
[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface COMEventsInterface
{
//[DispId(1)]
// we don't have any events, but if needed, include them here
}
[ComVisible(true)]
public interface ICOM
{
//Methods
int Sum(int[] intsToSum)
}
//Identifies this interfaces that are exposed as COM event sources for the attributed class.
[ComSourceInterfaces(typeof(COMEventsInterface))]
//Tells the compiler not to generate an interface automatically and that we are implementing our own interface (IDotNetEventSender)
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class COM : ICOM
{
// Methods
public int Sum(int[] intsToSum)
{
int sum = 0;
foreach ( int i in intsToSum )
{
sum += i;
}
return sum;
}
}
}
在调试模式下,现在将此项目标记为通过项目>属性>构建>注册com-interop来注册com interop。
在发布模式下,我有一个安装程序,它将我项目的主要输出标记为“vsdrpCOM”。
在大多数情况下,这很有效。但不知何故,在某些机器上(所有美国人)这都行不通。 com类已注册,但我经常收到错误:HRESULT 0x80131534,实际上已经在SO上描述了这个:Error when instantiating .NET/COM interop class via classic ASP
但是真的,我在这里看不到任何解决方案。我已经检查了用户权限,域名权限......
编辑: 我真正的类的构造函数做了这一件事: (我添加了try catch,因为我在SO上发现这是构造函数中的错误...)
// Constructor
public COM()
{
try
{
// register itself with the application
MyApplication.COMObject = this;
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
它只是将自己注册到静态类'属性COMObject:
private static COM _comObject;
public static COM COMObject
{
get
{
return _comObject;
}
set
{
_comObject = value;
}
}
虽然,COM类并不需要自己注册,如果我想触发事件,我已经做了这个以备将来使用
答案 0 :(得分:0)
好吧,我碰巧是我在我的一个静态类声明中声明了一个DateTime ... private DateTime myDateTime = Convert.ToDateTime(“15/09/2013 12:00:00”);
当然,在欧盟体系中,这会起作用,但对美国人(甚至其他人)来说这会产生错误,因为没有第15个月......
甚至在我的com-accessible类的构造函数之前就会触发它,这就是无法处理错误的原因。
愚蠢的错误,但证明有时错误看起来非常复杂而非常简单。