让C#ActiveX / COM库通过JScript工作

时间:2014-01-03 23:41:34

标签: c# com activex jscript

我已经检查了stackoverflow(以及其他地方看起来像什么)。我想得到一个COM解决方案,以便jscript文件可以写成

var T = new ActiveXObject("MySimulator.World"); 
T.MyMethod();

它将在命令提示符下执行

cscript mytest.js

在这种情况下,我收到错误“自动化服务器无法创建对象”。

在C#中,我遵循了各种建议,最新的界面是:

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83B")]
public interface IComMyReaderInterface
{
    void MyFunction();
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None), Guid("0D53A3E8-E51A-49C7-944E-E72A2064F9DD"), ProgId("MySimulator.World")]
[ComDefaultInterface(typeof(IComMyReaderInterface))]
public class MyReader : IComMyReaderInterface
{
    public MyReader()
    {
         ...
    }

    public void MyFunction()
    {
         ...
    }
 ...
}

谢谢,如果需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

我假设以下内容。您的开发环境可能是64位操作系统,您的C#DLL项目可能配置为使用Any CPU作为平台目标进行编译。如果是这样,请继续阅读。

选择x86x64并编译项目。如果您使用x86,请使用32位版本的RegAsm.exe注册程序集:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase assembly.dll

然后使用32位版本的cscript.exe运行JavaScript测试:

C:\Windows\SysWOW64\cscript.exe mytest.js

如果你选择x64,那就是:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /codebase assembly.dll C:\Windows\System32\cscript.exe mytest.js

[已编辑] 以下代码已经过验证,可以使用上述说明进行操作。

<强> C#:

using System;
using System.Runtime.InteropServices;

namespace ComLibrary
{
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual),
        Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83B")]
    public interface IComMyReaderInterface
    {
        void MyFunction();
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None), 
        Guid("0D53A3E8-E51A-49C7-944E-E72A2064F9DD"), 
        ProgId("MySimulator.World")]
    [ComDefaultInterface(typeof(IComMyReaderInterface))]
    public class MyReader : IComMyReaderInterface
    {
        public MyReader()
        {
        }

        public void MyFunction()
        {
            Console.WriteLine("MyFunction called");
        }
    }
}

JavaScript (mytest.js):

var T = new ActiveXObject("MySimulator.World"); 
T.MyFunction();

<强>输出

MyFunction called