2009-11-14 56 views
5

我想打电话给我写在C#从VBScript的方法。无法从VBScript调用C#代码 - 的ActiveX错误

我按照刚才的我可以在网上找到和我仍然有问题的指示所有。

具体我越来越

Error: ActiveX component can't create object

Code: 800A01AD

到目前为止,我已经做了以下内容:

  1. ComVisible(true)
  2. 使用regasm /codebase
  3. 强命名我的组装
  4. 注册证实,它是在注册表中并指向相应的CT定位
  5. 制造类公共
  6. 有没有静态方法
  7. 搞得我想打电话给公众的方法
  8. 有一个参数的构造函数
  9. 明确定义一个GUID

我的VBScript外观像这样:

set oObject = CreateObject("TTTTTT.FFFFF.CCCCCCCCC") 

我的C#代码l ooks like this:

using System; 
using System.IO; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace XXXXX.YYYYY 
{ 
    [ComVisible(true)] 
    [Guid("3EB62C37-79BC-44f7-AFBD-7B8113D1FD4F")] 
    [ProgId("TTTTTT.FFFFF.CCCCCCCCC")] 
    public class CCCCCCCCC 
    { 
     public void MyFunc() 
     { 
      // 
     } 
    } 
} 

任何人都可以帮忙吗?

+0

你能张贴的C#类类的声明,包括封闭的命名空间声明和类的任何属性? – itowlson 2009-11-14 03:11:31

+0

嗨,我用我的代码更新了我的问题。 – Grant 2009-11-14 03:14:07

+0

你见过http://stackoverflow.com/questions/769332/how-to-call-c-dll-function-from-vbscript? – abatishchev 2010-06-21 20:29:26

回答

2

这是一个简单的项目,只需几个步骤即可开始。

C#代码:

using System; 
using System.Reflection; 
using System.Runtime.CompilerServices; 
using System.Runtime.InteropServices; 

[assembly:System.CLSCompliant(true)] 
[assembly: ComVisible(true)] 
// The following GUID is for the ID of the typelib if this project is exposed to COM 
[assembly: Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b0")] 

namespace Cheeso.ComTests 
{ 
    [Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b1")] 
    public class TestReply 
    { 
     public string salutation; 
     public string name; 
     public string time; 
    } 

    [Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b2")] 
    public class TestObj 
    { 
     // ctor 
     public TestObj() {} 

     public TestReply SayHello(string addressee) 
     { 
      return SayHello(addressee, "hello"); 
     } 

     public TestReply SayHello(string addressee, string greeting) 
     { 
      string x = String.Format("{0}, {1}!", greeting, addressee); 
      Console.WriteLine("{0}", x); 

      TestReply r = new TestReply 
      { 
       salutation = greeting, 
       name = addressee, 
       time = System.DateTime.Now.ToString("u") 
      }; 
      return r; 
     } 
    } 
} 

的VBScript客户端代码:

Function Main() 
    Dim obj 
    Dim reply 
    set obj = CreateObject("Cheeso.ComTests.TestObj") 
    Set reply = obj.SayHello("Evgeny") 
    WScript.Echo "Reply at: " & reply.time 
    Set reply = obj.SayHello_2("Evgeny", "wassup") 
    WScript.Echo "Reply at: " & reply.time 
End Function 

Main 

编译:

(produce your .snk file, once) 
csc.exe /t:library /debug+ /keyfile:Foo.snk /out:TestObj.dll TestObj.cs 
regasm /codebase TestObj.exe 

然后,只需运行VBScript(通过的Cscript.exe)。

一旦你得到了基本的工作,你可以调整它,添加GAC,使typelib明确,添加一个明确的ProgId等等。这个例子显示了在一个为interop注册的类上重载的.NET方法会发生什么情况。有一个隐含的_2(_3,_4等)附加到方法名称。

+0

+1的完整示例。 – rekire 2012-09-28 19:17:09

+0

在x64操作系统上,您可能必须使用regasm中的/ regfile选项创建.reg文件,然后手动导入它。否则,注册表中没有对应的CLSID \ {GUID}键 - 它们位于HKCR \ Wow6432Node \ CLSID \ {GUID} – 2014-04-11 09:10:21

4

你读过这篇文章: COM Interop Exposed

last page(3)文章中,有一个列表:

  1. 定义一个.NET接口要暴露给 方法COM。
  2. 分配GUID与 的“GUID”属性,该属性界面。
  3. 让您的班级将您的 界面作为第一个界面。
  4. 分配GUID与 “GUID”属性,该属性类。
  5. 添加 “ClassInterface(ClassInterfaceType.None)” 属性,以防止regasm/tlbexp 从创建一个空的默认 接口。
  6. 硬编码特定版本号 在你的AssemblyVersion属性。
  7. 创建 您的组装和指向它通过 应将AssemblyKeyFile属性的强名称密钥对。
  8. 程序集添加到GAC,
  9. 通过 使用REGASM命令一起使用 了“/ TLB”选项来生成一个COM 类型库注册您的COM组件。

我不确定GAC和ClassInterfaceType.None是否是您拼图的缺失部分,您可能需要试一试。祝你好运!

+0

感谢您的回复。我已经检查了文章中的所有项目,不幸的是我仍然得到相同的错误。 – Grant 2009-11-14 04:55:41

+0

也许你可以从头开始编写这些示例代码中的一个组件,并查看它是否有效。如果没有,可能问题在于别处而不是你的代码。抱歉,我无法提供更多帮助。 – 2009-11-14 06:55:06

+0

链接中断 – bluish 2012-10-22 14:15:41

4

您的代码没有任何问题,您按照正确的安装步骤进行操作。但是,您收到的错误代码清楚地表明,脚本解释程序无法定位或加载程序集。解决这个问题的最佳方法是使用SysInternals的ProcMon实用程序。

我跑你的代码,而无需麻烦的,这些人在将procmon日志最相关的条目:

22 12:04:41.1795038 PM WScript.exe 55280 RegOpenKey HKCR\TTTTTT.FFFFF.CCCCCCCCC SUCCESS Desired Access: Read 
26 12:04:41.1795682 PM WScript.exe 55280 RegOpenKey HKCR\TTTTTT.FFFFF.CCCCCCCCC\CLSID SUCCESS Desired Access: Read 
29 12:04:41.1796996 PM WScript.exe 55280 RegQueryValue HKCR\TTTTTT.FFFFF.CCCCCCCCC\CLSID\(Default) SUCCESS Type: REG_SZ, Length: 78, Data: {3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F} 
34 12:04:41.1797653 PM WScript.exe 55280 RegOpenKey HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F} SUCCESS Desired Access: Read 
62 12:04:41.1802539 PM WScript.exe 55280 RegOpenKey HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32 SUCCESS Desired Access: Read 
71 12:04:41.1804181 PM WScript.exe 55280 RegQueryValue HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32\(Default) SUCCESS Type: REG_SZ, Length: 24, Data: mscoree.dll 
824 12:04:41.2425662 PM WScript.exe 55280 RegQueryValue HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32\1.0.0.0\CodeBase SUCCESS Type: REG_SZ, Length: 124, Data: file:///c:/projects/ClassLibrary2/obj/Debug/ClassLibrary2.DLL 
... Lots of .NET keys... 
1239 12:04:41.2970169 PM WScript.exe 55280 CreateFile C:\projects\ClassLibrary2\obj\Debug\ClassLibrary2.dll SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 
0

可能是,所有的问题都是由VS.引起 尝试通过键入命令行编译库

csc.exe /t:library AClass.cs /keyfile:Foo.snk - produce your key file with VS! 
regasm /codebase /tlb AClass.dll 

VS是增加了一些东西,如/警告:/ noconfig等,并且还添加引用到其他组件一样System.Core程序等,有时会导致错误。 对我来说,从csc编译工作。