COM 상호 운용성을 위해 .NET 어셈블리를 등록하면 내 방법이 노출되지 않습니다.

StackOverflow https://stackoverflow.com/questions/1001129

  •  05-07-2019
  •  | 
  •  

문제

좋아, 나는 미쳐 가고있다. COM 객체로 사용하기 위해 간단한 .NET 어셈블리를 보이도록 노력했지만 작동하지 않습니다. 나는 많은 다른 aproaches를 시도해 왔지만 그중 어느 것도 작동하지 않습니다. 지금까지 내가 가진 가장 가까운 것은 속성, 인터페이스, 수동으로 등록 등의 양이 가장 적은 것입니다.

다음과 같은 테스트로 vbscript가 있습니다.

Dim o
o = CreateObject("MyNamespace.MyClass")
msgbox o.Test()

내 C# 코드는 다음과 같습니다.

using System;
using System.Runtime.InteropServices;
namespace MyNamespace 
{
  [ProgId("MyNamespace.MyClass")]
  public class MyClass
  {
    public string Test()
    {
       return "teststring";
    }
  }
}

내 프로젝트 (vs2008)에서 나는 '어셈블리 com 가시적'을 선택했다.

나는 프로그램이 실제로 차이가 없다는 것을 알 수 있습니다 (어쨌든 어쨌든) - 실제 네임 스페이스+클래스 이름을 지정하는 한, 나는 그것을 무시할 수 있습니다.

문제는 - 내 CreateObject가 잘 진행되지만 메소드 테스트 ()를 찾을 수 없다는 것입니다. 실제로 DLL을 가져 와서 TLB를 추출하고 전혀 방법이 없을 것으로 기대한다면.

내가 얻는 오류는 이것입니다.

C : inetpub wwwroot asptest testrun.vbs (3, 1) Microsoft vbscript 런타임 오류 : 객체는이 속성 또는 메소드를 지원하지 않습니다 : '테스트'

나는 어떤 피드백도 좋아하지만 내가 시도한 것을 알려주는 것입니다. 나는 수업에서 Guid와 AttributeGuid를 엉망으로 만들었고, COM Interop에 등록하지 않고 대신에 COMVERIVES /Regfile을 등록하지 않았습니다.

마지막 참고 사항 - 대부분의 테스트는 서명되지 않은 어셈블리를 중심으로 회전했지만 강한 이름/키로 시도한 오류를 정확히 찾아 냈지만 아무것도하지 않았습니다.

누구든지 문제를 찾도록 도와 줄 수 있습니까?

도움이 되었습니까?

해결책 2

처음부터 시작하여 프로젝트에서 Com Interop과 관련하여 무엇이든 제거한 다음 추가했습니다.

[Guid(...some guid...)]
[ComVisible(true)]

MyClass와 나는 StrongName을 추가했습니다 (Project 설정을 사용하여 설정을 설정했습니다.

어셈블리를 컴파일했을 때 파일을 내가 한 다른 위치에 복사했습니다.

regasm MyNamespace.MyClass.dll /codebase /regfile

그런 다음 레지스트리 항목을 운영하고 수락했습니다.

이로 인해 변경 될 때마다 기존 (등록되지 않음)을 통해 파일을 다시 컴파일하고 복사하면 다음과 같습니다.

regasm MyNamespace.MyClass.dll /codebase

... 그리고 그게 IT입니다 - MyClass에 대한 변경 사항은 VBScript와 ASP 페이지에서 즉시 볼 수 있습니다.

다른 팁

Windows 7 RC 64 비트를 실행한다고 언급 했습니까?

글쎄, 나는 그것이 내 Vs가 그것을 제대로하지 않는다고 설명 할 수 있다고 생각합니다.http://kbalertz.com/956933/issues-building-project-assembly.aspxVS는 64 비트가 아니라 32 비트 버전의 레지스트리를 사용하는 것 같습니다 ...

메소드가있는 인터페이스를 정의하고 해당 인터페이스를 구현할 필요가 없습니까?

이것은 나를 위해 작동합니다 :

using System;
using System.Runtime.InteropServices;
namespace MyNamespace
{

    [GuidAttribute("8DDE02DF-B31C-4d91-98A7-C64444701985")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class clsCOMWraper
    {
       public string Test()
      {
         return "teststring";
      }
    }
}

조립에 서명해야합니다.

Regasm /Codebase에 등록하십시오

나는 클래스의 생성자도 보이지 않습니다. COM Interop은 COM 인터페이스를 성공적으로 생성하기 위해 기본 생성자 (매개 변수가없는)가 필요합니다.

생성자를 추가하고 작동하는지 확인하십시오.

이 링크를 확인하십시오. 완벽하게 작동합니다. "물체는이 속성이나 방법을 지원하지 않습니다" 코드 프로젝트 도움말

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