본문 바로가기
Windows/C#/WPF

[C#/WPF] 다른 경로로 Managed DLL 호출

by hirudev 2022. 5. 11.

들어가기 앞서

Unmanaged DLL : CLI 의 관리를 받지 못하는 DLL (native dll, 주로 순수 C/C++ 으로 만들어진 파일들(cpu instruction 에 직접적으로 의존하는 녀석들))

Managed DLL : CLI의 관리를 받는 DLL ( C#, C++/CLI 등으로 만들어진 DLL )

 

방법

1. App.config 파일 생성

 

2. 아래와 같이 xml 코드를 입력

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<runtime>
		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
			<probing privatePath="상대경로1;상대경로2;"/>
		</assemblyBinding>
	</runtime>
</configuration>

경로가 여러개로 적혀야 할 경우 상대경로1;상대경로2; 로 적어주면 되고

1개일 경우 상대경로1 정도만 적어주면 된다.

 

셈플코드

<!-- 여러개일 경우 -->
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
			<probing privatePath="dll1;dll2;"/>
		</assemblyBinding>

 

<!-- 1개일 경우 -->
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
			<probing privatePath="dll"/>
		</assemblyBinding>

 

3. 프로젝트 > 속성(properties) > 빌드 이벤트(build event) > 빌드 후 이벤트 명령줄(Post-build event command line) 에서 빌드 후 옮겨야할 dll 파일들을 커멘드라인으로 옮겨준다.

 

mkdir $(TargetDir)dll

move /Y "$(TargetDir)*.dll" "$(TargetDir)dll"

※ 해당 DLL 에서 생성하는 의존 파일이 있는 경우 의존 관계를 잘 살펴보고 같이 옮겨줘야 한다.

json 파일이나 xml 파일이나 dat 파일이나 exe 파일이나 등등..

 

4. 실행한다.

(빌드시 어플리케이션이름.exe.config 가 생성되는데 이 파일이 있어야 정상적으로 실행된다.)

 

+ 다른 이야기

 

Umanaged DLL 의 경우에는 DllImport("DLL 이름") 을 적을 때 상대경로로 적어주면 된다.

 

여담

암만 찾아봐도 config 파일을 exe 파일에 내장시킬만한 방법이 보이지 않는다...

추측되는 방법으로는 xml 형식이 아닌 코드로 강제삽입정도로 보이는데...

나중에 한번 시도해봐야겠다.

 

Main 메소드 호출

https://hirudev.tistory.com/56

C# Set probing privatePath without app.config?

https://stackoverflow.com/questions/10345240/c-sharp-set-probing-privatepath-without-app-config

 

You can also handle the AppDomain AssemblyResolve event like so:

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

and:

private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    var probingPath = pathToYourDataFolderHere;
    var assyName = new AssemblyName(args.Name);

    var newPath = Path.Combine(probingPath, assyName.Name);
    if (!newPath.EndsWith(".dll"))
    {
        newPath = newPath + ".dll";
    }
    if (File.Exists(newPath))
    {
        var assy = Assembly.LoadFile(newPath);
        return assy;
    }
    return null;
}

 

+ 22-05-11 2303 만듬.

시작 프로젝트 설정으로 바꿔서 빌드하면 확인해볼 수 있다.

(그리고 위에 소스에서 Asssembly.LoadFile 부분에서의 파라미터에 newPath 는 반드시 절대경로여야 인식한다.)

(Main 대신 App 클래스에서 OnStartup 메소드를 orverride 를 해도 된다)

AnotherDirectoryManagedDLL.zip
0.02MB

 

댓글