2017-03-17 8 views
0

저는 등록 없이도 무료 COM 기술을 사용하여 WSH 스크립팅을 성공없이 작동 시키려고했습니다. 나는이 문제에 대한 많은 답변을 읽었으며 성공하지 못한 채로 많은 것을 시도했다. 이제는 아래에 몇 가지 추가 정보를 제공하는 코드에서 올바르지 않은 부분을 수정하는 데 도움이 필요합니다.있음 WSH (vbscript/javascript)로 등록 무료 COM 예제의 간단하고 확실하게 작동하는 데모가 필요합니다.

테스트 목적으로 C-com 클래스 라이브러리 (C_Com_Demo.dll로 컴파일 됨)가 있습니다. Visual Studio 2015에서 "어셈블리 COM 표시"확인란을 선택하고 "Visual Studio 호스팅 프로세스 사용"및 "COM 등록 interop "이 선택되지 않았습니다.

C_Com_Demo.dll은 경로에 "C : \ 도구 \ 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> 

새로운 매니페스트 파일 버전 : "C : \ 도구 \ COM \ C_Com_Demo.manifest"

<?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과 동일한 위치에 또한

내 OS는 Windows 10 (64 비트)입니다. 따라서 플랫폼 대상을 x64로 설정했습니다. 닷넷 프레임 워크 4

로 설정 그리고 저는 여기에 방법에게 COM 객체의 전화를 시도하는 의해 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를이 같은 경로도에 위치를

RegAsm.exe 또는 VS의 빌드 옵션 "COM interop에 등록"을 통해 Com 클래스를 등록하면 WSH/vbscript가 실제로 작동하지만 원하는 목표는 등록 무료 기술을 통해 com 클래스를 획득하는 것은 아직 작동하지 않습니다. 이 오류는 항상 제 3 회 라인 (세트 DX = actCtx.CreateObject ("testClass.StringOperations"))에 와서

ActiveX-component cannot create the object, Code: 800A01AD.

사람이 나는 그것이 작동되도록하려면 위의 코드를 변경해야 무슨 말을 할 수 말한다 -에 대한 I를 정말 이걸로 붙어 있습니까?

+0

COM이면 'regsvr32.exe'를 사용하여 레지스트리에 'progid'를 등록하면 안됩니까? – Lankymart

+0

progid가 올바르지 않기 때문에 매우 빨리 종료됩니다. "C_Com_Demo"가 아니라 "testClass.StringOperations"입니다. 유일한 문제가 아니라'comClass' 대신에'assemblyIdentity'와'clrClass' 엘리먼트를 사용해야합니다. 이 특정 시나리오에서 CLR은 DLL을 찾는 데 어려움을 겪습니다. wscript.exe가 (boo)에 있거나 GAC에 설치해야하므로 c : \ windows \ system32에 복사해야합니다. –

+0

comClass 대신 clrClass를 추가했지만 매니페스트 유효성 검사에서는 최소 요구 사항 인 name 속성과 함께 assemblyIdentity 요소를 허용하지 않았습니다. 위와 같이 매니페스트 파일을 업데이트했습니다. 나는 또한 c : \ windows \ system32에 dll을 대처하려고 노력했다. 이것은 아직 문제를 해결하지 못했습니다. –

답변

2

reg-free 매니페스트를 만드는 기본 요구 사항은 클라이언트 프로그램의 매니페스트를 수정할 수 있다는 것입니다. 스크립트 호스트 (이 경우 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> 

참고 A [대해 ComVisible] .NET 클래스에 필요한 대신 comClassclrClass의 사용. progid에 유의하십시오. 원래의 매니페스트에 잘못되었습니다. CLR이 관련 어셈블리를 찾는 데 도움이되는 assemblyIdentity에 유의하십시오. 나는 그것을 나의 테스트 프로그램에서 ClassLibrary166이라고 불렀고, 필요에 따라 조정했다. 그리고 나는 강력한 이름을 주었고 sn.exe -T를 사용하여 그것을 보았다.

클래스에 [Guid ("9d3e378b-d20e-43bc-a49f-e7e002eee72e")] 속성을 지정하여 필수 clsid을 다시 추측 할 필요가 없도록 강력히 권장합니다.이 속성을 사용하지 않으면 클래스를 변경할 때 변경할 필요가없는 하나의 실패 모드가됩니다. 일반적으로 DLL 지옥이 발생하기 때문에이 속성을 사용하는 것은 좋지 않지만 매니페스트를 수정해야합니다.

file 요소를 어떻게 의도적으로 생략했는지 유의하십시오. 이 특정 경우에는 작동하지 않을 수 있습니다. CLR은이 시나리오에서 DLL에 대한 두 개의 특정 위치 만 찾습니다. GAC의 첫 번째 외관은 최상의 장소입니다. 그 이유는 Project> Properties> Signing 탭을 사용하여 강력한 이름을 부여했기 때문입니다. 하지만 여전히 설치 요구 사항이 있으므로 gacutil.exe -i으로 GAC에 어셈블리를 설치해야합니다. 또한 코드를 개발할 때 약간의 기쁨을 얻습니다. 이렇게하기 전에 코드를 안정화하십시오.

다른 곳은 EXE가있는 디렉토리입니다. 불행히도 그것은 c : \ windows \ system32입니다. 결코 그 디렉토리를 땜질하지 않는 것이 좋습니다. 모두와 모든 것, 매니 페스트는 그다지 도움이되지 않습니다.

+0

귀하의 전문 지식에 한스 감사합니다 - 이제는이 시나리오에서 등록 무료 매니페스트에 대한 내 목표의 무의미 함을 보러 왔습니다. 당신이 제공하는 정보를 가지고 나는 더 이상이 방향으로 나아가고 싶지 않습니다. –

+0

GAC에서 클래스의 vbscript 사용법을 사용자의 지침에 따라 잘 수행 할 수 있었기 때문에이 문제와 시나리오로 돌아 왔습니다. 그러나 이제는 IIS 서버 내에서 vbscript/classic asp 클래스를 사용할 수 있는지 알고 싶습니다. 즉, DX = actCtx.CreateObject ("testClass.StringOperations") 줄에 오류가 발생하여 즉시 작업을 수행 할 수 없습니다. 0x80070002 - 알 수없는 예외입니다. 어떤 생각이 어떻게 해결할 수 있습니까? –

+0

FileNotFoundException인데, 나는 그 문제에 대한 답의 마지막 절반을 헌납했다. –