繁体   English   中英

需要使用WSH(vbscript / javascript)的无注册COM示例的简单且可靠的演示

[英]In Need of simple and surely working demo of Registration-Free COM example with WSH (vbscript/javascript)

我一直在尝试使免注册COM技术与WSH脚本配合使用而没有成功。 我已经阅读了很多有关此问题的回复,并尝试了很多没有成功的事情。 现在,我需要帮助来修复代码中不正确的内容,下面提供了一些进一步的信息。

这是C-com类库(已编译到C_Com_Demo.dll中),用于测试目的,是我使用Visual Studio 2015创建的,未选中“使程序集可见”,未选中“启用Visual Studio托管进程”和“注册COM互操作”。

C_Com_Demo.dll位于路径“ C:\\ tools \\ com \\ C_Com_Demo.dll”中

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace testClass
{
[ComVisible(true)]
public class StringOperations
{
    [ComVisible(true)]
    public string getValue1(string sParameter)
    {
        switch (sParameter)
        {
              case "a":
                return "A was chosen";

              case "b":
                 return "B was chosen";

              case "c":
                 return "C was chosen";

               default:
                   return "Other";
            }
       }
       public string getValue2()
       {
        return "From VBS String Function";
       }
    }
}

这是清单文件,它可能非常简单:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Minimalist Manifest -->
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <file name = "C_Com_Demo.dll">
      <comClass clsid="{9d3e378b-d20e-43bc-a49f-e7e002eee72e}"
      progid = "C_Com_Demo"/>
   </file>
</assembly>

新清单文件版本:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Minimalist Manifest -->
  <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <file name = "C_Com_Demo.dll"/>
   <clrClass clsid="{9d3e378b-d20e-43bc-a49f-e7e002eee72e}"
   name="C_Com_Demo"/>
  </assembly>

“ C_Com_Demo.manifest”也与dll位于同一位置:“ C:\\ tools \\ com \\ C_Com_Demo.manifest”

我的操作系统是Windows 10(64位)。 因此,我将Platform target设置为x64。 .Net Framework设置为4。

这是我尝试调用com-object方法的WSH / vbscript:

Set actCtx = WScript.CreateObject("Microsoft.Windows.ActCtx")
    actCtx.Manifest = "C:\Tools\com\C_Com_demo.manifest"
Set DX = actCtx.CreateObject("testClass.StringOperations")
MsgBox DX.getValue1("a")

vbscript也位于同一路径中,即“ C:\\ Tools \\ com \\”

如果我通过RegAsm.exe或VS的构建选项“ Register for COM interop”注册Com类,则WSH / vbscript确实有效,但通过免注册技术获得Com类的理想目标尚无法实现。 错误总是出现在第三行(Set DX = actCtx.CreateObject(“ testClass.StringOperations”)),并说

ActiveX组件无法创建代码为800A01AD的对象。

谁能说出我应该在上面的代码中进行哪些更改才能使其正常工作-因为我确实对此感到困惑?

要获得免注册清单的回报,一项基本要求是您可以修改客户端程序的清单。 这是一个很大的障碍,脚本宿主(在这种情况下为c:\\ windows \\ system32 \\ wscript.exe)已经具有清单,并且不允许您嵌入自己的文件或使用.manifest文件。

充其量您可以编写一个组件清单,它需要类似于以下内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity name="ClassLibrary166" version="1.0.0.0" publicKeyToken="6e06a399ac99f486" />
    <clrClass 
        clsid = "{9d3e378b-d20e-43bc-a49f-e7e002eee72e}"
        name = "testClass.StringOperations"
        progid = "testClass.StringOperations"
        runtimeVersion = "v4.0.30319">
    </clrClass>
</assembly>

注意[ComVisible] .NET类需要使用clrClass而不是comClass 注意progid ,这在您的原始清单中是错误的。 并注意assemblyIdentity ,帮助CLR找到相关的组装所需。 我在测试程序中将其称为ClassLibrary166,并根据需要进行调整。 我给了一个很强的名字,使用sn.exe -T可以看到它。

我强烈建议您为该类提供[Guid(“ 9d3e378b-d20e-43bc-a49f-e7e002eee72e”)]属性,这样您就不必再猜测所需的clsid 没有属性,当您对类进行任何更改时,它都会更改,这是您不需要的另一种失败模式。 通常,使用该属性是一个坏主意,因为它会导致DLL地狱,但这就是清单应该解决的问题。

请注意,我是如何有意省略了file元素的。 在这种特定情况下,它不能工作,在这种情况下,CLR仅在DLL的两个特定位置查找。 GAC的外观首先是最适合的地方。 我通过使用“项目”>“属性”>“签名”选项卡为它取一个好名字的原因。 但是它要求您使用gacutil.exe -i将程序集安装到GAC中,因此您仍然有安装要求。 开发代码时也很少高兴,请确保在执行之前使其稳定。

它看起来的另一个位置是EXE所在的目录。 不幸的是,这是c:\\ windows \\ system32,修改该目录绝不是一个好主意。 总而言之,清单并没有太大帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM