문제

COM을 통해 도서관을 노출하려고하지만 실제 문제보다 도구와 싸우고있는 것 같습니다. COM 노출 클래스를 작성하는 방법에 관계없이 "XXX.DLL에는 COM Interop에 등록 할 수있는 유형이 포함되어 있지 않습니다"(프로젝트 속성에서 COM Interop에 대한 등록으로 표시). 아래의 간단한 클래스조차도 (comvisible (false)로 서명하고 표시된 어셈블리의 유일한 클래스도 여전히 경고합니다.

  [Guid("77699130-7D58-4d29-BE18-385871B000D1")]
  [ComVisible(true)]
  public interface IExample
  {
    string GetText();
    void SetText(string text);
  }

  [Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")]
  [ComVisible(true)]
  public class Example : IExample
  {
    private string m_text = "default text";

    public string GetText()
    {
      return m_text;
    }

    public void SetText(string text)
    {
      m_text = text;
    }
  }

나는 "유형이 성공적으로 등록 된 유형"을 기꺼이 언급하는 출력의 명령 줄에서 regasm을 실행하려고했습니다. 그러나 /Verbose Switch로 실행되는 추가 정보가 표시되지 않습니다 (이름이나 등록 된 유형의 수를 나열한 것을 기억하는 것 같습니다). 또한 /regfile 스위치로 Regasm을 실행하려고 시도하여이를 생성하는 Regfile을 생성했습니다.

[HKEY_CLASSES_ROOT\ComExample.Example]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\ComExample.Example\CLSID]
@="{F91E5EE1-D220-43B5-90D1-A48E81C478B7}"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="ComExample.Example"
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32\1.0.0.0]
"Class"="ComExample.Example"
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\ProgId]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

나는 어떤 척도의 com 마법사가 아니지만 등록은 나에게 유효한 것처럼 보입니다. 그러나 어셈블리에서 Regasm을 실행할 때 레지스트리에는 아무것도 나타나지 않는 것 같습니다.

그래서 내 질문은 간단한 예에서 등록 작업을하는 것이 누락되었는지 여부입니다. 허위 표시가보고 있으며 등록이 실제로 정확하며 COM 등록이 실제로 작동하는지 더 잘 결정할 수있는 방법입니다.

편집 : KEV가 제안한 변경을 사용하여 VS2008의 경고를 피할 수는 없지만 Regasm을 직접 사용하여 레지스트리에 등록한 것을 얻을 수 있습니다 (VS2008 통합의 레지스트리에서는 아무것도 없음).

그런 다음 간단한 클래스를 제거하려고 시도하여 빈 어셈블리가있었습니다. 이에 대한 regasm은 어떤 종류의 경고도보고하지 않았으며 "성공적으로 등록 된 유형"만보 고했습니다. 다른 어셈블리 중 일부에서 Regasm을 실행할 때 "Regasm : 경고 RA0000 : 유형이 등록되지 않았다"와 같은 경고가 나타납니다. 여기서 무슨 일이 일어나고 있는지, 레지스트리를 제외하고는 무엇이든 신뢰할 수 있으며 Regasm의 온/오프 경고는 어떻습니까?

도움이 되었습니까?

해결책

다음과 같이 귀하의 코드를 기반으로 클래스 라이브러리 프로젝트를 만들었습니다.

프로젝트 속성 페이지에서 서명 탭을 선택하십시오. '어셈블리 서명'확인란을 확인하고 선택하십시오. <New...> '강력한 이름 키 파일 선택 :'드롭 다운 상자를 선택하십시오.

그런 다음 다음 수업을 추가했습니다 (Example.cs):

[Guid("77699130-7D58-4d29-BE18-385871B000D1")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IExample
{
    [DispId(1)]
    string GetText();

    [DispId(2)]
    void SetText(string text);
}

[Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Example : IExample
{
    private string m_text = "default text";

    [ComVisible(true)]
    public string GetText()
    {
      return m_text;
    }

    [ComVisible(true)]
    public void SetText(string text)
    {
      m_text = text;
    }
}

그런 다음 프로젝트를 구축 한 다음 DLL이 빌드에서 출력되는 명령 줄로 떨어졌습니다.

등록하려면 :

regasm.exe COMInteropTesting.dll /register /codebase /tlb

구성 요소가 여러 응용 프로그램에 액세스 해야하는 경우 :

gacutil.exe -i COMInteropTesting.dll

이것은 Windows 2003 32Bit, Windows 2008 32 비트 및 Windows 7 64 비트에서 잘 작동했습니다.

그러나 Gotcha는 64 비트 시스템에서 CSCRIPT를 사용하여 구성 요소를 테스트하는 경우 올바른 CSCRIPT 통역사를 실행해야한다는 것입니다. 32 비트를 사용하여 어셈블리를 등록한 경우 RegAsm.exe (에 C:\Windows\Microsoft.NET\Framework\v2.0.50727) 그런 다음 32 비트 CScript 통역사를 실행해야합니다. c:\Windows\SysWOW64.

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