.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 두 번째 메서드가 호출될 수 있습니다.
IUnknown
이 QueryInterface
, AddRef
, Release
의 3개를 가지고 있기 때문에, 3개 어긋난 결과, 자신의 경우는 존재하지 않는 영역을 참조해 버렸던 것이 아닐까 생각하고 있다. [확인] Access Violation. 잘 모르겠어요.
Reference
이 문제에 관하여(.NET Framework에서 COM을 작성하면 CLR의 Access Violation이 발생할 때 InterfaceTypeAttribute를 쓰는 것을 잊지 않았는지 확인하십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/qpwakaba/items/573ee31d0dd5ec93fe79
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
.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 두 번째 메서드가 호출될 수 있습니다.
IUnknown
이 QueryInterface
, AddRef
, Release
의 3개를 가지고 있기 때문에, 3개 어긋난 결과, 자신의 경우는 존재하지 않는 영역을 참조해 버렸던 것이 아닐까 생각하고 있다. [확인] Access Violation. 잘 모르겠어요.
Reference
이 문제에 관하여(.NET Framework에서 COM을 작성하면 CLR의 Access Violation이 발생할 때 InterfaceTypeAttribute를 쓰는 것을 잊지 않았는지 확인하십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/qpwakaba/items/573ee31d0dd5ec93fe79
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
[ComImport]
[Guid(~~~~)]
public interface Hoge
{
// ~~~~~
}
[ComImport]
[Guid(~~~~)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface Hoge
{
// ~~~~~
}
자신의 경우는, 뒤로부터 3번째의 메소드가 불려 갔을 때에 액세스 위반이 되어 있었지만, 메소드가 4개 이상 있는 인터페이스의, 최초로 쓰여진 메소드가 불려 가는 경우는 어쩌면 4 두 번째 메서드가 호출될 수 있습니다.
IUnknown
이 QueryInterface
, AddRef
, Release
의 3개를 가지고 있기 때문에, 3개 어긋난 결과, 자신의 경우는 존재하지 않는 영역을 참조해 버렸던 것이 아닐까 생각하고 있다. [확인] Access Violation. 잘 모르겠어요.
Reference
이 문제에 관하여(.NET Framework에서 COM을 작성하면 CLR의 Access Violation이 발생할 때 InterfaceTypeAttribute를 쓰는 것을 잊지 않았는지 확인하십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/qpwakaba/items/573ee31d0dd5ec93fe79텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)