[ComVisible(true)] : COM Interface에 등록할 수 있도록 보이게 함. (요걸 하면 regasm 명령어로 등록이 가능해짐) ``` c# [ ComVisible(true), Guid("4f84b96c-d3d9-4b14-ae3a-bbea2bc6a7f8"), ClassInterface(ClassInterfaceType.AutoDispatch), ] ``` 위 세가지는 COM에 노출되기위해 반드시 있어야하는 옵션들임. ```c# [ComVisible(true)] [ClassInterface(ClassInterfaceType.None)] [ProgId("kr.co.aim.iobridge.secs.service.DriverInstance")] public class DriverInstance { ... 생략 ``` 위의 과정을 거치고 build하면 TLB도 같이 떨어짐. Assembly 등록 (COM에 dll 등록) ```bash regasm /codebase .\CSLib.dll regasm /u /codebase .\CSLib.dll ``` RAD Studio ( 델파이 프로젝트에 TBL 등록 ) ![[Pasted image 20240206150810.png]] Chat GPT Q: 프로젝트에 TLB도 추가되어 있어야하고 레지스트리에도 추가가 되어있어야 하는거야? A: COM 객체를 사용하는 Delphi 프로젝트에서는 해당 COM 객체의 Type Library(TLB)를 프로젝트에 추가하고, 레지스트리에도 등록되어 있어야 합니다. ![[Pasted image 20240206150030.png]] ![[Pasted image 20240206150106.png]] Class를 그대로 쓰기보다는 Interface를 만들어서 쓰는게 조금 더 호환성이 좋은 것 같긴함. ```c# [ ComVisible(true), Guid("c5a0e65b-c891-47f4-9610-297314a6e22a"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown) ] public interface ICallback { void OnConnection(ConnectionInfo connStatus); void OnMessageReceived(ReceivedInfo receivedInfo); void OnMessageSendFinished(SendFinishInfo sendInfo); void OnDriverEvent(DriverEventInfo driverEvent); } ``` c#에서 COM 호환가능한 Interface를 만들려면 (혹은 만들어주려면) InterfaceType(ComInterfaceType.InterfaceIsIUnknown) 이 문구가 반드시 필요함. - **32비트 DLL을 64비트 레지스트리에 등록할 때:** - `HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\` - **32비트 DLL을 32비트 레지스트리에 등록할 때:** - `HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\Interface\` 인터페이스는 regasm 이 등록해주지 않는 것 같다. Visual Stuido 에서 COM Interop 등록 체크해놓고 빌드하면 이때는 VS가 인터페이스도 등록을 해주는 것 같음. 이 때, AnyCPU로 빌드를 하면 인터페이스는 wow6432node의 하위 interface 디렉토리에 추가해준다. x86으로 빌드하면 추가가.. 안되나?;; 아에 추가가 안된다. cmd에서 바로 등록하려면 /tlb 옵션넣으면 된다. .tlb 파일은 남에게 줘도 아무 의미가 없을 듯 하다. dll 가지고 각자 알아서 tlb를 만들어야 만드는 과정에서 그 환경에 맞는 레지스트리 위치에 interface 등록을 하기 떄문이다. /HKEY_LOCAL_MACHINE/SOFTWARE/WOW6432Node/==Classes==/Interface/{C5A0E65B-C891-47F4-9610-297314A6E22A} /HKEY_LOCAL_MACHINE/SOFTWARE/WOW6432Node/Interface/{C5A0E65B-C891-47F4-9610-297314A6E22A} 두개의 경로가 있는데..? 왜지..? 둘 중 하나만 지워도 둘 다 사라짐..;; 인터페이스는 HKEY_LOCAL_MACHINE 하위에 등록해서 쓰는 거 같고 클래스는 HKEY_CLASSES_ROOT 하위에 등록해서 쓰는 것 같다. TLB는 32비트, 64비트 와 상관이 없다. dll은 각각 비트의 regasm 명령어로 각각 dll을 추가해줘야한다. ( 안해주면 잘못된 클래스 문자열입니다. 에러 발생함 ) c#에서 델파이 함수를 Interface로 호출할 때 stdcall 붙여주는거.. 안붙이면 x86에서 안됐음 tlb 파일 만들 때 regasm.exe를 x86 버전으로 사용해야함. x64꺼로 사용해서 만든 tlb는 rad studio에 등록이 안됨. ( 이유는 모르겠음, successfuly 라고 뜨는데 등록은 안됨. 버그같기도 함 )