
Running .NET from VBA
VBA에서 AccessVBOM(Visual Basic 프로젝트에 대한 프로그래밍 방식 액세스가 신뢰되지 않음)을 우회한 후 AppDomain.ExecuteAssembly 또는 기타 편리한 방법을 사용하여 CLR(.NET) 어셈블리를 VBA에 로컬 및 원격으로 로드하는 다양한 방법을 실험하고 있습니다.
vba2clr.*.vba:
AccessVBOM 레지스트리 키를 1로 설정합니다.Word.Application COM 개체를 인스턴스화합니다. (Excel.Application, MS PowerPoint, Access 등이 될 수 있음).wordObj.Application.Run...을 사용하여 ExecuteAssembly.vba 매크로 실행ExecuteAssembly.clr.2.0.vba: .NET 3.5까지
IDomain, ICRHost)를 인스턴스화합니다.AppDomain.ExecuteAssembly 인수를 두 개의 별도 배열(변수, 형식)로 패킹합니다.AppDomain.ExecuteAssembly(Arg1, Arg2) (VFTable 오프셋 51)를 호출합니다. 여기서 Arg1은 ".NET 어셈블리 URL" 또는 "로컬 경로"이고 Arg2는 반환 값입니다.QueryInterface, AddRef, Release 메서드로 설정되어 있기 때문입니다.ExecuteAssembly.clr.x.vba: .NET 2, 3.5 및 4.x를 지원합니다.
Word.Application(또는 Excel.Application 등)에 대한 COM 개체를 생성하면 기본 WinWord.exe 프로세스 대신 svchost.exe의 자식 프로세스로 추가 WinWord.exe가 생성됩니다.AccessVBOM 레지스트리 키는 WScript.Shell을 사용하여 COM을 통해 수정/복원되며, win32 API를 사용하는 것이 더 나은 대안이 될 수 있습니다.AccessVBOM 레지스트리 키를 업데이트하는 것보다 분명히 더 안전합니다. 이 부분은 다음에 남겨두겠습니다...System.CodeDom.Compiler와 같은 다른 .NET API를 사용하여 VBA에서 c# 코드를 컴파일/실행할 수 있습니다. 아래 참조를 확인하세요.