注册我的.net程序集以实现COM互操作性不会暴露我的方法
-
05-07-2019 - |
题
好的,我疯了。我一直在努力使一个简单的.net程序集可见,用作COM对象,但它不起作用。我一直在尝试很多不同的方法,但它们都没有用。到目前为止,我得到的最接近的是具有最少量属性,接口,手动注册等的那个。
我有一个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运行良好,但无法找到方法Test()。事实上,如果我拿dll并提取tlb并期望我根本看不到任何方法。
我得到的错误是:
C:\的Inetpub \ wwwroot的\ ASPTest \ testrun.vbs(3, 1)Microsoft VBScript运行时错误: 对象不支持此属性 或方法:'测试'
我喜欢任何反馈,但只是为了让你知道我一直在尝试什么。我在类上搞乱了Guid和AttributeGuid,在类上明确定义了COMVisible,我尝试不注册COM互操作,而是使用regasm / codebase / regfile。
最后一个注意事项 - 我的大部分测试都围绕着一个未签名的程序集,但我试图查明我使用强名称/密钥尝试的错误,但它没有做任何事情。
有人可以帮我找到问题吗?
解决方案 2
我从一开始就开始在我的项目中移除了有关COM互操作的任何内容,然后我添加了
[Guid(...some guid...)]
[ComVisible(true)]
在MyClass上我添加了一个强名称(使用项目设置来设置它 - 而不是在AssemblyInfo.cs中定义它。
当我编译程序集时,我将文件复制到我做了
的另一个位置regasm MyNamespace.MyClass.dll /codebase /regfile
然后我跑了并接受了注册表项。
这使它工作 - 每当我进行更改时,我只需重新编译并复制旧文件(不注销),然后我只会这样做:
regasm MyNamespace.MyClass.dll /codebase
......就是这样 - 我对myClass所做的更改在我的vbscript和我的asp页面中都可以立即显示。
其他提示
我提到过我运行Windows 7 RC 64位吗?
嗯,我认为这可能解释了我的VS做得不对: http://kbalertz.com/956933/Issues-building-project-assembly。 ASPX 似乎VS使用32位版本的注册表而不是64位...
您是否需要定义一些具有这些方法的接口,并实现该接口?
这对我有用:
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";
}
}
}
必须签署此程序集。
注册regasm / codebase
我没有看到Class的任何构造函数。 COM Interop需要一个默认构造函数(没有任何参数)才能成功生成COM接口。
尝试添加构造函数,看看它是否有效。
检查此链接是否完美有效我遵循它并为错误提供了完美的解决方案,例如"对象不支持此属性或方法“ 代码项目帮助