2014-11-13 5 views
1

내 제목이 충분하지 않을 수 있습니다. VB6 매크로를 개발할 수있는 응용 프로그램과 함께 작업합니다. 이 매크로는 내가 개발 한 .NET DLL로 작업해야합니다. x86 모드에서 응용 프로그램을 시작하고 매크로를 실행하려고하면 정상적으로 작동하며 클래스의 메서드에 액세스 할 수 있습니다.x64의 외부 VB6 매크로에서 호출 할 때 AnyCPU COM 라이브러리 (.tlb 파일)가 작동하지 않습니다.

하지만 64 모드에서 동일한 기능을 수행 할 때이 오류가 : "Automation server can't create object"

정말로 이상한 것은 내가 64에 문제가 될만한 86 unnmanaged COM DLL을를 사용 하지 해요이다 건축물. 내가 할 때 : "Dim myClass as new MyClass.App" 작동하지만 예를 들어 myClass.Start() 메서드를 호출 할 때이 오류가 발생합니다. 그리고 내 MsgBox('hello world')을 내 Start 메소드에 넣으려고했는데 내 코드와 아무런 관련이 없다는 것을 확인했습니다. 매크로를 내 수업에 TLB 파일로 연결하고 있습니다.

RegAsm으로 내 DLL을 등록하려고했지만 x64에서 여전히 작동하지 않습니다. 내 TLB의 x86 및 x64 버전을 생성하는 방법이 있습니까? 그런 다음 두 참조를 모두 추가하고 x64 버전에서 Start 메서드에서 오류가 발생하면 x86 메서드를 호출합니다 (완벽한 솔루션은 아니지만 여전히 ..).

이 아이디어를 어떻게 해결할 수 있습니까?

+0

Regasm.exe의 64 비트 버전 –

+0

대답을 제거한 이유는 무엇입니까? 내가 코멘트 한 것처럼 64 비트/.NET 4.0 버전의 RegAsm을 사용했지만 여전히이 오류가 발생합니다 ... –

답변

1

한스 (Hans)가 말한 것처럼 Regasm.exe의 64 비트 버전을 사용자에게 제공해야했습니다. 설치 후 RegAsm을 수동으로 시작하려고했지만 작동하지 않았습니다. 먼저 프로젝트의 빌드 후 이벤트에서 추가했습니다.

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe" "$(TargetPath)" 

디버그 버전의 트릭이었습니다. 이상하게도 AnyCPU 버전이 디버그 모드에서 내 x64 응용 프로그램에서 처음에는 제대로 작동했지만 설치 프로젝트를 만들 때 충돌이 발생했습니다 (그 이유는 알 수 없습니다 ...).

Public Overrides Sub Commit(savedState As System.Collections.IDictionary) 
     MyBase.Commit(savedState) 

     'Check if we're on a x64 OS 
     If Environment.Is64BitOperatingSystem Then 
      'Get the Windows dir on the current computer 
      Dim winDir As String = New IO.DirectoryInfo(Environment.SystemDirectory).Parent.FullName 

      'Define the path to regasm for x64 machines 
      Dim regasmPath As String = IO.Path.Combine(winDir, "Microsoft.NET", "Framework64", System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion, "RegAsm.exe") 

      If File.Exists(regasmPath) Then 'Si le chemin existe, on enregistre la DLL 
       'Get the location of our DLL 
       Dim componentPath As String = GetType(Installer).Assembly.Location 

       'Executes regasm 
       System.Diagnostics.Process.Start(regasmPath, "/codebase """ & componentPath & """") 
      End If 
     End If 
    End Sub 

내가 원래 기사에서 변경 무엇 :하지만 응용 프로그램을 설치할 때이 변경이 내 문제가 해결되지 않기 때문에, 나는 내 사용자 지정 작업의 "커밋"이 추가 (: Regasm- 64bit or 32bit though windows installer in visual studio이 문서 기준) RegAsm에 대한 경로입니다. 설치가 x86이기 때문에 RuntimeEnvironnment의 디렉토리는 "Microsoft.NET \ Framework ..."경로를 가리키고 있습니다.이 경로는 내 작업의 목적을 무력화시킨 "Framework64"가 아니라 (이미 32 비트 COM interop로 등록되어 있습니다), 그래서 RegAsm의 x64 버전을 구해서 실행하려고합니다.