MaxScript로 Dll Load 하기

Max 2013. 11. 29. 12:55

MaxScript로 Dll Load 하기

 

 

Max에서 Dll을 Load 할때 많이 몇가지 방법으로 부를 수 있습니다.

 

 

1. dotnet.loadAssembly

 

Maxscirpt 의 기능으로 assembly를 부르는 방식으로 가장 일반적으로 사용되는 방식입니다.

 

<샘플 코드>

assemblyPath = "C:\\HwangGoon\\hwanggoon.dll"

dotnet.loadAssembly assemblyPath

 

Maxscript 의 기능으로 부르는 방식이니 가장 손쉽게 dll을 Load 할 수 있습니다.

다만 이방법의 단점이라면..

한번 Dll을 Load 하면 맥스를 종료 할 때까지 Dll이 열려있는 형태로 있습니다.

열려 있다는건 파일을 삭제 수정 할 수 없다는 이야기와 같습니다.

이를 보완하기 위한 방법으로 아래 방식을 사용 할 수 도 있습니다.

 

 

2. dynamicDll

 

Dll파일을 수정 할 수 있는 방법

이 방식은 Dll File을 만들지 않고 메모리에서 바로 사용하는 방법입니다.

Dll을 만들 수 있으신 분은 직접 만들어 사용하시는 정신 건강에 좋습니다.

(String으로 코드를 모두 작성하다 보니 디버깅이 힘들어서..)

 

<샘플 코드>
  source = ""
  source += "using System;\n"
  source += "using System.Reflection;\n"
  source += "using System.IO;\n"
  source += "namespace Dynamics\n"
  source += "{\n"
  source += " public class dynamicDll\n"
  source += " {\n"
  source += "  public static Assembly LoadAssembly (string filename)\n"
  source += "  {\n"
  source += "   Assembly library = null;\n"
  source += "   using (FileStream fs = File.Open(filename, FileMode.Open))\n"
  source += "   {\n"
  source += "    using (MemoryStream ms = new MemoryStream())\n"
  source += "    {\n"
  source += "     byte[] buffer = new byte[fs.Length];\n"
  source += "     int read = 0;\n"
  source += "     while ((read = fs.Read(buffer, 0, (int)fs.Length)) > 0)\n"
  source += "     ms.Write(buffer, 0, read);\n"
  source += "     library = Assembly.Load(ms.ToArray());\n"
  source += "    }\n"
  source += "   }\n"
  source += "   return library;\n"
  source += "  }\n"
  source += " }\n"
  source += "}\n"
  dno_CSharpCodeProvider = dotNetObject "Microsoft.CSharp.CSharpCodeProvider"
  dno_CompilerParameters = dotNetObject "System.CodeDom.Compiler.CompilerParameters"
  dno_CompilerParameters.GenerateInMemory = on
  dno_CompilerResults = dno_CSharpCodeProvider.CompileAssemblyFromSource dno_CompilerParameters #(source)

 dno_dynamicDll = dno_CompilerResults.CompiledAssembly.CreateInstance "Dynamics.dynamicDll"

 assemblyPath = "C:\\HwangGoon\\hwanggoon.dll"

 dno_dynamicDll.LoadAssembly assemblyPath

 

Dll의 크기 만큼 메모리를 잡고, Dll을 그대로 올립니다.

그리고 메모리에 있는 Dll을 Load하는 방식인데요.

쉽에 이야기하면, Dll 복사본을 이용한다고 생각하시면 이해하기 쉽습니다.

 

이렇게 Dll을 Load 하게 되면 Dll이 열려있지 않은 관계로 Dll을 삭제 수정 할 수 있습니다.

다만 맥스를 다시 실행해야 갱신 됩니다.

 

'Max' 카테고리의 다른 글

삼각형 안에 점이 있는지 확인하는 방법  (3) 2013.12.10
MaxScirpt Exception Log 남기기  (0) 2013.12.04
MaxScript) SVN 접근하기  (0) 2013.11.26
플랜 나무 음영개선 방법  (0) 2013.02.15
MaxScript) Matrix 함수 정보  (0) 2013.01.19
Posted by Hwanggoon
,