우리는 WinForms 컨트롤을 .NET UserControl로 랩핑하고 Microsoft에서 사용할 COM 어셈블리로 사용할 수있게하는 VB.NET 프로젝트를 가지고 있습니다 사무실. 프로젝트는 이것을 수행하기위한 표준 기술을 사용합니다. 즉, 프로젝트 속성에서 '어셈블리 COM- 보이기'및 'COM Interop에 등록'체크 상자를 설정하고, 강력한 이름으로 어셈블리에 서명하는 등의 작업을 수행합니다. 우리의 고객은 마이크로 소프트 오피스의 64 비트 버전이 .NET의 COM 래퍼를 사용하려고 할 때VB.NET UserControl의 COM 버전을 Microsoft Office의 64 비트 버전에서 사용할 수 있도록합니다.
<ComRegisterFunction()>
Public Shared Sub RegisterForCOM(ByVal aType As Type)
Dim strCtrlKey, strVersion As String
Dim typeLibGUID As Guid
strCtrlKey = "CLSID\" + aType.GUID.ToString("B")
Dim key As RegistryKey = Registry.ClassesRoot.OpenSubKey(strCtrlKey, True)
key.CreateSubKey("Control")
key.CreateSubKey("Implemented Categories\{40FC6ED4-2438-11CF-A3D8-080036F12502}")
key.CreateSubKey("MiscStatus").SetValue("", "131457")
typeLibGUID = Marshal.GetTypeLibGuidForAssembly(aType.Assembly)
key.CreateSubKey("TypeLib").SetValue("", typeLibGUID.ToString("B"))
Dim asmVersion As Version = aType.Assembly.GetName().Version
strVersion = asmVersion.Major.ToString() + "." + asmVersion.Minor.ToString()
key.CreateSubKey("Version").SetValue("", strVersion)
key.Close()
End Sub
<ComUnregisterFunction()>
Public Shared Sub UnregisterForCOM(ByVal aType As Type)
Try
Registry.ClassesRoot.DeleteSubKeyTree("CLSID\" + aType.GUID.ToString("B"))
Catch
End Try
End Sub
이 구조는 순간까지 년 동안 아무 문제없이 일했다 레지스트리에서 구성 요소의 등록은 다음과 같다. 인터넷에서이 질문에 대한 답변을 찾으려고했지만 WinForms 컨트롤에 대해 64 비트 호환 COM 래퍼를 구현하는 방법에 대한 지침을 찾을 수 없었습니다.
전혀 가능합니까? 그렇다면 올바른 방향으로 우리를 지적 할 수 있습니까?
UPDATE : 현재 우리의 사용자는 COM 래퍼를 등록 할 수있는 관리자 권한으로 실행 명령 프롬프트에서 다음 명령을 사용
regasm <full_path_to_dll> /tlb /codebase
이것은 문제가되지 않지만 중요한 정보는 질문에 없습니다. 사용자가 " 'COM Interop에 등록"확인란을 클릭하지 않습니다. 이 구성 요소가 사용자 컴퓨터에 어떻게 등록되어 있는지 설명해야합니다. 설치 프로그램을 만든 경우 64 비트 설치 프로그램이어야합니다. Regasm.exe를 사용하는 경우에는 64 비트 버전을 사용해야합니다. –
@HansPassant, 우리 사용자들은 regasm을 사용합니다. 방금 질문에이 명령 줄 호출을 추가했습니다. – TecMan
사용자가 불완전한 설치 지침에서 파악할만큼 잘 알고 있지만 사용하려는 Regasm.exe의 네 가지 버전 중 어떤 버전을 사용하는지 모를 것이라고 생각합니다. 왜 당신은 그것을 너 자신을 시도하지 않는가 당신은 빨리 그것으로 틀린 무슨을 볼 것이다. –