好了,我要疯了。 我一直试图做一个简单的.NET程序集可见作为COM对象使用,但它不工作。 我一直在尝试不同的aproaches的,但他们没有工作。 到目前为止,我已经得到了最接近的是一个带有属性,接口最少的,手动注册等。
我有一个VBScript作为测试看起来像这样:
Dim o
o = CreateObject("MyNamespace.MyClass")
msgbox o.Test()
我的C#代码如下所示:
using System;
using System.Runtime.InteropServices;
namespace MyNamespace
{
[ProgId("MyNamespace.MyClass")]
public class MyClass
{
public string Test()
{
return "teststring";
}
}
}
我的项目(VS2008)我选择了“使装配COM可见” - 这添加的属性我的AssemblyInfo.cs我还检查了“注册为COM互操作”。
我可以看到,PROGID真的没什么区别(在我的案件反正) - 只要我指定的真正命名空间+类名,我可以但覆盖它。我想这很好。
问题是 - 我的CreateObject顺利,但该方法测试()无法找到。 事实上,如果我把DLL和提取TLB和期望,我看不出有什么方法可言。
我得到的错误是这样的:
C:\的Inetpub \ wwwroot的\ ASPTest \ testrun.vbs(3,1)Microsoft VBScript运行时错误:对象不支持此属性或方法: '测试'
我喜欢任何反馈,但只是为了让你知道我一直在努力。 我曾与GUID和AttributeGuid乱搞的类,在类中定义的标记有ComVisible特性明确和我试着不让注册为COM互操作,而是做了regasm /基本代码/ REGFILE。
最后一点 - 我大部分的测试都是围绕着一个非签名的程序集,而是试图找出我用强名称/键尝试以及错误,但它没有做任何事情。
谁能帮我看看这个问题,好吗?
我提到我运行Windows 7 RC 64位?
嗯,我想这或许可以解释我的VS是不是在做正确的事: http://kbalertz.com/956933/Issues-building-project-assembly.aspx看来VS使用注册表的32位版本,而不是64位?
我从一开始就开始,就在我的项目COM互操作删除任何东西,我加入
[Guid(...some guid...)]
[ComVisible(true)]
在MyClass的,我增加了一个强名称(使用项目设置来设置它 - 而不是在AssemblyInfo.cs中定义它。
当我整理汇编,我将文件复制到另一个位置在那里我做了
regasm MyNamespace.MyClass.dll /codebase /regfile
然后我跑,并接受了注册表项。
这使得它的工作 - 每当我做出改变,我只是重新编译和其复制旧的(没有注销),然后我只能做:
regasm MyNamespace.MyClass.dll /codebase
......这就是它 - 我对MyClass的所做的更改都imediately可见我的VBScript和在我的ASP页。
难道你需要定义一个有方法的一些接口,以及实现该接口?
这对我的作品:
using System;
using System.Runtime.InteropServices;
namespace MyNamespace
{
[GuidAttribute("8DDE02DF-B31C-4d91-98A7-C64444701985")]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class clsCOMWraper
{
public string Test()
{
return "teststring";
}
}
}
Thse总成必须签名。
的,注册regasm /基本代码
我没有看到的任何类构造函数。 COM互操作需要一个默认构造函数(没有任何PARAMS),它成功地生成一个COM接口。
尝试添加一个构造函数,看看它是否工作。
检查此链接它完美地我跟着它工作,给喜欢“对象不支持此属性或方法”在错误的完美解决方案代码项目帮助
文章来源: Registering my .net assembly for COM interoperability doesn't expose my methods