최근에 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# 태그를 제거한 후 깨졌습니다.
C# 프로젝트의 프로젝트 속성에서 "빌드"탭의 "COM interop에 등록"을 선택하십시오. –
@ OlivierJacot-Descombes 안타깝게도 우리는 PC에 대한 관리자 액세스 권한이 없으므로 DLL 등록은 옵션이 아닙니다. –
처음 보았습니다. DllGetClassObject() 내보내기 및 포함 된 형식 라이브러리가있는 일반 COM dll 인 경우 기술적으로 가능합니다. C#으로 생성 된 DLL의 경우도 마찬가지입니다. dev 컴퓨터에 대한 관리자 액세스 권한이없는 이런 종류의 개발은 실용적이지 않습니다. Regasm.exe의/regfile 옵션을 사용하여 생성 된 .reg 파일을 편집하여 HKLU를 HKCU로 바꿀 수는 있지만, 급하게 바쁜 작업이 될 수 있습니다. HKCU에 등록하는 사용자 지정 [ComRegisterFunction]은 더 실용적이지만 올바르게하기가 어렵습니다. –