【问题标题】:How to create an C#.Net DLL to use in JavaScript如何创建 C#.Net DLL 以在 JavaScript 中使用
【发布时间】:2015-04-27 06:43:12
【问题描述】:

我创建了一个带有几个简单类的 .Net DLL。我已经使用 RegAsm 注册了 DLL,并且收到了类型已成功注册的消息。

使用的 RegAsm 语法:

C:\Windows\Microsoft.NET\Framework\v4.0.30319>RegAsm.exe "D:\Projects\TestDLL.Core.dll"

C#代码:

namespace MyTestDLL.Core    
    {  
        public class PacketInfo    
        {    
          // constructor
          public PacketInfo()
          {
          }

          public string HostName { get; set; }
            //   and so on ......

        }    
    }

我已在此 DLL 的 AssemblyInfo.cs 文件中将 ComVisible 属性设置为 true。 // [程序集:ComVisible(true)]

但是,当我在 JavaScript 中创建一个对象并在命令提示符下运行脚本时,我得到的不是对象就是 null。

JS代码:

 var testObj = new ActiveXObject(MyTestDLL.Core.PacketInfo);
        testObj.HostName = "Test";

谁能告诉我如何解决这个问题?

【问题讨论】:

标签: javascript c# com regasm


【解决方案1】:

您需要在类中添加ProgId attribute,如下所示:

[Guid("some guid that you will never change")]
[ProgId("MyLib.PacketInfo")] // this is arbitrary
public class PacketInfo    
{
    ....
}

guid 是可选的,但如果你不自己设置它,它将是你无法控制的,所以最好定义它。当然,我没有添加 ComVisible,因为您已经在程序集级别定义了它(我个人更喜欢在类级别设置它)。

然后,一旦注册,你就可以像这样使用它(使用 progid 作为字符串):

var testObj = new ActiveXObject('MyLib.PacketInfo');
testObj.HostName = "Test";

【讨论】:

  • 感谢您的评论。让我试试这个并更新你。
  • 这没有按预期工作。当我运行 js 时,我仍然得到同样的错误。myObj 为空或不是对象。我完全按照你的建议做了。甚至在类级别本身添加了 COM Visible 属性。
  • 可能还有很多其他问题。您需要使用 /codebase 参数运行 regasm,并且您还需要确保您的 javascript 以与程序集相同的位数运行(x86 或 x64)。
【解决方案2】:

我可以通过在类上方的 My DLL 中添加以下行来实现这一点,

 [Guid("A32AB771-9967-4604-B193-57FAA25557D4"), ClassInterface(ClassInterfaceType.None)] 

之前我的代码中没有 ClassInterfaceType 部分。 还要确保您的每个类都具有唯一的 GUID。 仅供参考:您可以使用 Visual Studio Tools GUID Creator GUI 创建 GUID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多