문제

나는 vb6에서 vb6의 .NET 어셈블리를 gAC에 배치하지 않고 regasm.exe에 /codebase 인수를 사용하지 않고 사용하려고합니다.

내가 이해 한 바에 따르면 .NET 클래스 라이브러리에서 regasm.exe를 실행할 때 클래스 라이브러리의 각 클래스에 대한 레지스트리 항목을 작성하여 COM 클라이언트에게 .NET 객체를 대변하는 .NET 객체로 작용하는 mscoree.dll을로드해야합니다. com 사용. Mscoree.dll은 클래스 레지스트리의 inprocserver32/어셈블리 키를 사용하여 클래스 구현을 포함하는 클래스 라이브러리를 결정합니다.

regasm.exe와 함께 /codebase를 사용하거나 GAC에 클래스 라이브러리를 넣으면 모든 것이 정상적으로 작동합니다. 그러나 흩어진 문서에서 알아낼 수있는 한 MSCoree.dll은 현재 디렉토리와 경로에서 어셈블리를 찾아야합니다. 클래스) 그리고 GAC에서는 찾을 수 없습니다.

C# 코드는 가능한 한 간단합니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace myinterop
{
    [Guid("B1D6B9FE-A4C7-11DD-B06B-E93056D89593")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class MyServer
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }
}

그리고 문제는 컴파일 된 DLL과 동일한 디렉토리에 넣은 vbscript 하나의 라이너로 재현됩니다.

object = CreateObject("myinterop.MyServer")

내가 여기서 무엇을 놓치고 있습니까? mscoree.dll이 어딘가 어딘가를 찾는 방식에 대한 결정적인 설명이 있습니까?

BTW, 저는 .NET 2.0을 사용하고 있습니다. 예, GAC에 어셈블리를 넣어야한다는 것을 알고 있습니다. 왜 이것이 광고대로 작동하지 않는지 궁금합니다.

도움이 되었습니까?

해결책

에서 MSDN:

/코드베이스 : 레지스트리에서 코드베이스 항목을 만듭니다. 코드베이스 항목은 글로벌 어셈블리 캐시에 설치되지 않은 어셈블리의 파일 경로를 지정합니다. 이후에 글로벌 어셈블리 캐시에 등록하는 어셈블리를 설치하는 경우이 옵션을 지정해서는 안됩니다. /Codebase 옵션으로 지정한 AssemblyFile 인수는 강력한 이름의 어셈블리 여야합니다.

광고대로 작동하는 것 같습니다. 어셈블리를 GAC에 넣지 않으면 FilePath에 액세스 할 수 있도록 /코드베이스를 사용해야합니다.

다른 팁

원하는 것을 달성하려면 .NET 어셈블리와 vb6_app.exe (.NET 어셈블리 참조)에 대한 .manifest 파일을 작성해야한다고 생각합니다. 등록이없는 COM은 Google을 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top