문제

C ++ COM 구성 요소가 인스턴스화되는 .NET 응용 프로그램이 있습니다. COM 구성 요소를 하위 형태 창에서로드합니다. .NET 애플리케이션에서 편집하는 공통 리소스가 있으며, 이는 Com DLL이 시작하기 위해 Inturn을 사용하고 있습니다.

다음 단계의 단계가 수행되는 경우 :
1. 새 하위 창에 COM 구성 요소를 인스턴스화합니다. COM 구성 요소는 인스턴스화되어 자식 형식에 의해 사용되며, 사용 된 후에는 COM 구성 요소가 언로드되기를 희망하여 NULL로 설정되고 있습니다.
2. 어린이 창을 열어두고 리소스를 편집하십시오.
3. 이제 가서 양식을 "새로 고침"하여 새 COM 인스턴스를 생성하고 변경된 리소스의 재선을 확인하십시오. 그러나 리소스는 새로 고치지 않습니다.

우리는 또한 Marshal.releasecomobject 방법을 사용했지만 성공하지 못했습니다. 조언을 해주세요.

올바른 솔루션이 없습니다

다른 팁

DLL이 .NET AppDomain에로드되면 DLL을 내릴 수 없습니다. CLR의 불행한 한계입니다. 언로드하기 위해 DLL이 절대적으로 필요하면 다음을 수행 할 수 있습니다.

  1. 새로운 appDomain을 만듭니다
  2. DLL을 새 DLL에로드하십시오
  3. 새로운 appdomain에서 작업을 수행하십시오
  4. 새로운 appDomain을 내립니다

DLL이 하나의 AppDomain에만로드되면 AppDomain을 언로드하면 DLL도 언로드됩니다. 따라서 이것은 DLL을 내릴 것입니다. 그러나 그것은 꽤 헤비급 답변입니다.

Com Object와 DLL은 다른 하나에 상주하더라도 두 가지 다른 것입니다. 특정 해킹이 가능하지만 훨씬 더 나은 솔루션은 DLL 언로드에 의존하지 않는보다 현명한 방식 으로이 부분을 다시 작성하는 것입니다.

Clrinterop 페이지에 대한 토론 질문에서 설명한 내용을 매우 밀접하게 설명합니다. 쓰레기 수집기는 기본 DLL을 내리지 않습니다. 인용 : "CLR이 해당 DLL에 의존하는 다른 코드 (기본 코드)가있을 수 있기 때문에이를 수행하는 데 매우 위험 할 수 있습니다. DLL이 더 이상 사용되지 않으면 Freelibrary와 같은 Windows API를 호출 할 수 있습니다. DLL을 내리는 가장 쉬운 방법이 되십시오. "

따라서 Freelibrary를 상호 작용하여 기본 DLL을 내리려면 사용해야합니다. 추가 할 수 있지만 : DLL을 내릴 필요가없는 솔루션을 찾을 수 있다면 그렇지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top