2010-05-01 4 views
6

.NET COM interop은 지금까지 항상 아주 잘 작동했습니다. Windows 7로 업그레이드 한 이후로 .NET COM 객체가 더 이상 작동하지 않습니다..NET COM Interop on Windows 7 64 비트는 저에게 두통을줍니다.


namespace Crap 
{ 
    [ComVisible(true)] 
    [Guid("2134685b-6e22-49ef-a046-74e187ed0d21")] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class MyClass : IMyClass 
    { 

     public MyClass() 
     {} 

     public void Test() 
     { 
      MessageBox.Show("Finally got in here."); 
     } 

    } 
} 



namespace Crap 
{ 
    [Guid("1234685b-6e22-49ef-a046-74e187ed0d21")] 
    public interface IMyClass 
    { 

    } 
} 

 

조립뿐만 아니라 대해 ComVisible을 표시됩니다 :

내 COM 개체는만큼 간단합니다.

나는 성공적으로 (관리자 모드)

regasm /codebase /tlb "path"

레지스터를 사용하여 어셈블리를 등록합니다. 레거시 32 및 64 비트를 시도했습니다. 두 시간이 나는이 VBScript를 사용 "객체 Crap.MyClass를 생성하지 못할 ActiveX 구성 요소"오류

를 얻을 :


dim objReg 
Set objReg = CreateObject("Crap.MyClass") 
MsgBox typename(objReg) 
 

fuslogvw 중 하나를 나에게 힌트를 제공하지 않습니다. COM 객체가 Vista 32 비트 컴퓨터에서 완벽하게 작동합니다.

나는 왜 그 문제에 대한 해결책을 구글로 도출 할 수 없었는지 이해할 수 없다. 나는 정말로 그 문제에 봉착 한 유일한 사람인가?

OleView에서 내 개체가 등록되었습니다. 다른 COM 개체도 만들 수 있습니다. 내 자신의 COM 개체와 만 작동하지 않습니다.

는 케빈

+0

이 스레드에 답변 해 주시겠습니까? 감사 : –

답변

2

나는 C#을 사람이 아니지만, 여기에 내가 VB.net에서 변환 샘플이 등록되었는지 확인하는 방법입니다. 참고로 프로젝트 레벨에서 하나의 네임 스페이스를 확보 한 다음 VB 프로젝트에서이 클래스를 확인해야했습니다. C# 프로젝트와는 다른 점을 이해합니다. 내가 COM에 대해 걱정하는 경우

[ComClass(MyClass.ClassId, MyClass.InterfaceId, MyClass.EventsId)] 
public class MyClass { 

    // These GUIDs provide the COM identity for this class 
    // and its COM interfaces. If you change them, existing 
    // clients will no longer be able to access the class. 
    public const string ClassId = "f58411e1-1689-4bf3-a0e1-b49f479e28ba"; 
    public const string InterfaceId = "f4a575c6-62d2-44eb-af0f-f5b2bb65ad51"; 
    public const string EventsId = "ad56e4f9-3512-4233-aae4-7d1c2457c08f"; 

    // A creatable COM class must have a Public Sub New() 
    // with no parameters, otherwise, the class will not be 
    // registered in the COM registry and cannot be created 
    // via CreateObject. 
    public SalePayStatus() : base() 
    { 
    } 
} 

, 나는 항상 적절한 항목이 만들어 졌음을 보장하기 위하여 먼저 레지스트리에 확인. 그 버전 및 MSI 설치 원인 문제, expecially 제거 (레지스트리 정리하지 않음) 또는 MSI 다시 설치 및. NET COM 개체를 기존 COM 항목을 덮어 쓰는 모든 종류의 번거 로움 원인이 발견했습니다.

일반적으로 x64 및 x32 빌드 .net DLL에 대해서는주의해야합니다.예를 들어 VBS 엔진의 C : \ Windows \ SysWow64 \ 또는 C : \ Windows \ System32 \ edition을 명시 적으로 참조해야 할 수 있습니다.

마지막으로 x32 COM .net 구성 요소가있는 x64 서버의 ASP 웹 사이트에서 VBS를 사용하는 경우 IIS 7 응용 프로그램 풀 고급 옵션 32 비트 응용 프로그램이 True/False로 올바르게 설정되어 있는지 확인해야합니다.

1

감사합니다, 감사합니다! 내가 알아서해야 할 2 개의 레지스트리가 있다는 것을 몰랐다. Win7 64bit로 전환 할 시간이었다. :)

감사합니다.

같은 문제로 실행하는 다른 사람들을 위해

: WScript와는 (일반적으로 VBS 파일을 실행하는 클라이언트) 64 비트 모드에서 실행 => RegAsm을 64 비트는 Excel과 같은

다른 일반적인 클라이언트가 실행되어 사용되는 32 비트 모드 => RegAsm 32 비트가 사용됩니다.

Visual Studio는 32 비트에서 실행됩니다. => COM interop 등록은 32 비트 레지스트리에 COM 개체 만 등록합니다.

지금 파악해야하는 유일한 것은 VS 설정 두 버전

+1

이 스레드와 같은 소리가납니다. 가장 도움이 된 답변을 표시하십시오. –

+0

이것은 (일련의) 주석 (들)이거나 원래 게시물의 편집이어야합니다. –