如何解决.NET COM可调用包装DLL的注册/使用问题



我已经编写了一个C#.NETCom可调用包装器DLL。我用StrongName对它进行了签名,并用64位regasm.exe注册了代码库和typelib。注册和所有控件的方法都可以用64位OleViewer看到。但是,当我尝试使用64位\Windows\System32\cscript.exe中的控件时:

  Set logger = CreateObject("MyCompany.LoggerControl")

这会产生错误:

Microsoft VBScript运行时错误:ActiveX组件无法创建对象:"MyCompany.LoggerControl"

使用Sysutils的ProcMon来追踪这一点,我发现:

下午1时41分44秒8295486cscript.exe 24028 RegOpenKey HKCR\MyCompany.LoggerControl
未找到姓名所需访问权限:读取

但是,Regedit中存在此密钥。调用进程是在提升的命令提示符下运行的。如果是安全问题,错误不应该是"ACCESS DENIED"而不是"NAME NOT FOUND"吗?

还有什么其他工具可以跟踪这种类型的COM控件注册错误?

以下是几个故障排除思路:

  1. 识别尝试创建对象时返回的确切错误编号:

    出现错误时继续下一步
    设置logger=CreateObject("MyCompany.LoggerControl")
    如果错误,则WScript.EEcho"错误#"&错误编号WScript.Echo错误描述WScript.退出1如果结束

  2. 查找此错误代码。例如,它是"拒绝访问"还是其他错误?

  3. 创建一个C#可执行文件来调用您的对象,看看它是否能成功创建它。

  4. 请确保您的DLL没有任何其他依赖项,无法将其加载到脚本运行的目录中。您可以从运行脚本的目录中使用dependens.exe,也可以使用我最喜欢的regsvr32穷人技术来尝试加载DLL。如果DLL由于依赖关系而无法加载,您将看到一个错误对话框,告诉您找不到其他DLL或无法加载其依赖关系之一。如果它可以加载DLL ok,它会说它成功注册了它。

    C: \PathToVbs>regsvr32 C:\PathToYourLL\YourLL.dll

最新更新