2017-10-23 9 views
2

최근에 VBScript에서 등록되지 않은 DLL을 사용하는 방법을 찾고있었습니다. This 대답은 대답을 제공 한 사람의 의견에 언급 된대로 DLL이 COM 인터페이스를 노출한다고 가정하면 GetObject을 사용하여 수행 할 수 있습니다. 나는 전에 C#으로 코딩 한 적이 없지만 그 언어에 대한 답변이 있기 때문에 시도해보고 싶었습니다. 일부 검색 후, 나는 this 사이트에 다음 코드 예제를 발견VBScript - 등록되지 않은 DLL 사용

using System; 
using System.Runtime.InteropServices; 

namespace Tester 
{ 
    [Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
    public interface _Numbers 
    { 
     [DispId(1)] 
     int GetDay(); 

     [DispId(2)] 
     int GetMonth(); 

     [DispId(3)] 
     int GetYear(); 

     [DispId(4)] 
     int DayOfYear(); 
    } 

    [Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")] 
    [ClassInterface(ClassInterfaceType.None)] 
    [ProgId("Tester.Numbers")] 
    public class Numbers : _Numbers 
    { 
     public Numbers() { } 

     public int GetDay() 
     { 
      return (DateTime.Today.Day); 
     } 

     public int GetMonth() 
     { 
      return (DateTime.Today.Month); 
     } 

     public int GetYear() 
     { 
      return (DateTime.Today.Year); 
     } 

     public int DayOfYear() 
     { 
      return (DateTime.Now.DayOfYear); 
     } 
    } 
} 

의 Visual Studio 2010 Professional을 사용하여, 나는 새로운 C# 클래스 라이브러리를 생성하고 테스터를 지명했다. 위의 코드를 기본 Class1.cs 파일에 복사하고 컴파일했습니다. 그런 다음, 다음 코드로 .vbs 파일을 만들었습니다.

Option Explicit 

Dim Obj 

' This part gives the following error message: 
' ActiveX component can't create object: 'GetObject' 
Set Obj = GetObject("C:\MyFolderPath\Tester.dll", "Tester.Numbers") 
MsgBox Obj.GetDay 

그러나 코드는 오류가 발생하여 개체를 인스턴스화하지 않습니다. Windows 7 64 비트이기 때문에 wscript.exe의 32 비트 및 64 비트 버전에서 .vbs 파일을 실행 해 보았습니다. 그러나 오류는 두 번 모두 같았습니다. 그래서, 내가 C# 코드 및/또는 Visual Studio에서 변경해야 할 다른 옵션을 변경해야 할 필요가 있습니까? 아니면 연결된 대답에 대한 사람의 주장이 단순히 잘못 되었습니까?

EDIT 1

내 질문 this 하나의 중복이 아니다. 나는 비슷한 성질의 요청을 깨닫는다. 그러나 제 질문은 증명의 짐과 관련이 있습니다. Nilpo는 GetObject을 사용하면 VBScript가 COM 인터페이스를 노출하고 동일한 질문에서 자신의 위치를 ​​방어하기까지 등록되지 않은 C# DLL을 사용하여 개체를 인스턴스화 할 수 있습니다. 나는 그가 기술 한 방법을 활용할 수 있었고 성공하지 못했을 때 최선을 다했다. 가능한 경우 간단한 예제를보고 싶습니다. 그리고 그렇지 않다면 나는 왜 그런지 보여주는 문서를보기를 희망했습니다.

또한 내가 찾고있는 기능을 허용하는 유일한 방법이라면 기꺼이 다른 프로그래밍 언어를 사용하겠습니다. 따라서, 나는 C#을 내 질문 제목에서 제거하고 C# 태그를 꺼냈다. 2

편집은 내가 게시 된 원래의 C# 코드에 대한 강조 구문을 고정. 첫 번째 편집에서 질문에서 C# 태그를 제거한 후 깨졌습니다.

+1

C# 프로젝트의 프로젝트 속성에서 "빌드"탭의 "COM interop에 등록"을 선택하십시오. –

+0

@ OlivierJacot-Descombes 안타깝게도 우리는 PC에 대한 관리자 액세스 권한이 없으므로 DLL 등록은 옵션이 아닙니다. –

+1

처음 보았습니다. DllGetClassObject() 내보내기 및 포함 된 형식 라이브러리가있는 일반 COM dll 인 경우 기술적으로 가능합니다. C#으로 생성 된 DLL의 경우도 마찬가지입니다. dev 컴퓨터에 대한 관리자 액세스 권한이없는 이런 종류의 개발은 실용적이지 않습니다. Regasm.exe의/regfile 옵션을 사용하여 생성 된 .reg 파일을 편집하여 HKLU를 HKCU로 바꿀 수는 있지만, 급하게 바쁜 작업이 될 수 있습니다. HKCU에 등록하는 사용자 지정 [ComRegisterFunction]은 더 실용적이지만 올바르게하기가 어렵습니다. –

답변

-1

옳은 길을 가고 있지만 CodeProject 링크를 사용하면 상승 된 권한이 필요한 COM에 라이브러리를 등록해야합니다.

그러나 노출하려는 클래스에 ComVisible attribute을 추가하면 DLL을 컴파일 한 후에 GetObject()을 통해 호출 할 수 있습니다.

[Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")] 
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Tester.Numbers")] 
[ComVisible(true)] 
public class Numbers : _Numbers 
{ 
    public Numbers() { } 

    public int GetDay() 
    { 
     return (DateTime.Today.Day); 
    } 

    public int GetMonth() 
    { 
     return (DateTime.Today.Month); 
    } 

    public int GetYear() 
    { 
     return (DateTime.Today.Year); 
    } 

    public int DayOfYear() 
    { 
     return (DateTime.Now.DayOfYear); 
    } 
} 
+0

게시 및 수신 한 수정을 시도했습니다. .vbs 파일을 실행했을 때와 정확히 같은 오류가 발생했습니다. –

+0

@ChrisD 32 비트 용으로 * (새로 빌드) *를 컴파일하고 32 비트 하위 시스템을 통해 VBScript를 실행했거나 그 반대의 경우도 확실합니까? – Lankymart

+0

Visual Studio 프로그램이 32 비트이고, DLL이 기본적으로 32 비트 모드로 컴파일 될 것이라고 확신합니다. 64 비트 컴파일을 가능하게하는 설정을 보거나 수정하지 않았습니다. 그리고 wscript.exe의 32 비트와 64 비트 버전에서 .vbs 파일을 테스트했습니다. –