문제

다른 어셈블리의 클래스를 사용하는 C# 프로그램이 있으며이 클래스는 관리되지 않은 DLL을 호출하여 일부 처리를 수행합니다. 스 니펫은 다음과 같습니다.

public class Util
{
    const string dllName = "unmanaged.dll";
    [DllImport(dllName, EntryPoint = "ExFunc")]
    unsafe static extern bool ExFunc(StringBuilder path, uint field);

    public bool Func(string path, uint field)
    {
        return ExFunc(new StringBuilder(path), field);
    }

    ...
}

Util util = new Util();
bool val = util.Func("/path/to/something/", 1);

내가 가진 문제는 "func"라고 부르면 메인 C# 프로그램이 언로드되지 않는다는 것입니다. Main Form 내에서 Close ()를 호출 할 때 작업 관리자를 보면 프로세스가 여전히 있습니다. "func"에 대한 호출을 제거하면 프로그램이 잘로드됩니다. 나는 약간의 테스트를 수행했고 프로그램 주요 기능은 확실히 돌아 오므로 여기서 무슨 일이 일어나고 있는지 잘 모르겠습니다.

도움이 되었습니까?

해결책

소스 코드가 있습니까? unmanaged.dll ? 다른 스레드를 시작하고 종료하지 않거나 차단하는 일을해야합니다. DllMain, 등.

다른 팁

관리되지 않는 라이브러리가 비동기 처리를위한 스레드를 산란하는 것처럼 보입니다.

확률은 일종의 취소 기능을 지원합니다. 프로그램 종료시 전화를 걸려고하는 것이 좋습니다. 비동기 호출이 완료되기 전에 프로그램이 완료되면 "완료 대기"기능을 찾아서 "func"메소드에서 돌아 오기 전에 호출하십시오.

기본 응용 프로그램이 닫힐 때 놓치지 않는 배경 스레드가 없을 수 있습니다. 코드를 보지 않고는 확실하게 말할 수는 없지만 그것이 제가 생각하는 것입니다.

아마도 이상적이지는 않지만 해결 방법이 필요한 경우 사용할 수 있습니다.

System.Diagnostics.Process.GetCurrentProcess().Kill();

이렇게하면 프로세스 수준에서 앱을 종료하고 프로세스를 통해 스폰 된 모든 스레드를 제거합니다.

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