들어가기 앞서
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 를 해도 된다)
'Windows > C#/WPF' 카테고리의 다른 글
[WPF] Main 메소드 호출 (0) | 2022.05.11 |
---|---|
Controls Styles and Templates (0) | 2022.04.14 |
[WPF] 내 나름대로의 MVVM 요약 (수정. 210515_1836) (0) | 2021.05.15 |
[WPF] & 등의 이스케이프 문자 처리 (0) | 2021.05.13 |
[WPF] 나중에 참고할 링크 (0) | 2021.05.12 |
댓글