.NET Framework에서 COM을 작성하면 CLR의 Access Violation이 발생할 때 InterfaceTypeAttribute를 쓰는 것을 잊지 않았는지 확인하십시오.

6876 단어 .NETFrameworkC#COM

전제



.NET Framework에서 CoClass를 구현하고 등록하고 클래스를 외부 응용 프로그램에서 호출합니다.

반죽 한 환경



.NET Framework 4.5
Windows 10(x64)

결론



interface 선언에 InterfaceTypeAttribute을 설정하지 않았습니다.

안된 코드


[ComImport]
[Guid(~~~~)]
public interface Hoge
{
  // ~~~~~
}

호출자 프로세스에 Visual Studio에서 연결할 때 이러한 예외가 나타났습니다.


잘 된 코드


[ComImport]
[Guid(~~~~)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface Hoge
{
  // ~~~~~
}



이하, 해결까지의 경위 떨어지는 C#에서 COM에 등록하는 클래스를 만들어 실험하고 있었는데, 특정 타이밍에 호출원의 어플리케이션이 떨어진다. C# 으로 쓴 부분에 문제가 있다고 생각하고 try-catch 등 평소대로 디버깅을 해 보더라도 이들 모두에 도달하지 않고 떨어진다. 아무 것도 건드리지 않고. 디버거를 연결해 봅니다. Visual Studio를 해당 프로세스에 연결한 다음 실험을 수행하면 이러한 표시가 나타납니다.



떨어지는 타이밍 확인



실험을 계속하고 있으면, 적어도 이 타이밍에서 떨어진다는 것을 특정할 수 있었으므로, 코드를 줄여 실험을 한 결과,
C#에서 작성한 클래스의 인스턴스를 COM을 통해 외부에서 호출되도록 등록하는 코드를 실행하지 않거나 등록 후 즉시 등록을 해제한 결과 떨어지지 않는 것을 알았다.

찾기



등록 메소드에 건네주는 인수의 형태를 확인해, 건네주는 클래스의 선언을 확인해, 인터페이스의 확인을 한 곳에서, InterfaceTypeAttribute 을 이 인터페이스만 써 잊고 있는 것을 알고, 덧붙인 곳에 등록을 해도 액세스 위반이 발생하지 않게 되었다.

경우에 따라 액세스 위반이되지 않고 다른 방법이 호출 될 수 있습니까?



자신의 경우는, 뒤로부터 3번째의 메소드가 불려 갔을 때에 액세스 위반이 되어 있었지만, 메소드가 4개 이상 있는 인터페이스의, 최초로 쓰여진 메소드가 불려 가는 경우는 어쩌면 4 두 번째 메서드가 호출될 수 있습니다.
IUnknownQueryInterface, AddRef, Release의 3개를 가지고 있기 때문에, 3개 어긋난 결과, 자신의 경우는 존재하지 않는 영역을 참조해 버렸던 것이 아닐까 생각하고 있다. [확인] Access Violation. 잘 모르겠어요.

좋은 웹페이지 즐겨찾기