2013-03-11 8 views
0

더미 DLL을 만들었습니다. 네임 스페이스에서 S1에 액세스 할 수 있습니다. 나는 내 함수를 볼 수 있고 그것의 exe 형태로 일일 때 구조체를 볼 수있다.IL Generator에서 DLL을 만들 때 액세스하지 않습니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection.Emit; 
using System.Reflection; 
using System.Threading; 
using System.Diagnostics.SymbolStore; 
using System.IO; 

namespace emitTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AssemblyName assemblyName = new AssemblyName(); 
      assemblyName.Name = "HelloWorld"; 
      AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); 
      ModuleBuilder module; 
      module = assemblyBuilder.DefineDynamicModule("HelloWorld.exe", true); 
      TypeBuilder typeBuilder = module.DefineType("MyNamespace.HelloWorldType", TypeAttributes.Public | TypeAttributes.Class); 
      MethodBuilder methodbuilder = typeBuilder.DefineMethod("Main", MethodAttributes.HideBySig | MethodAttributes.Static | MethodAttributes.Public, typeof(void), new Type[] { typeof(string[]) }); 
      var s1 = module.DefineType("Space.S1", TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.AnsiClass | TypeAttributes.SequentialLayout | TypeAttributes.BeforeFieldInit, typeof(System.ValueType)); 
      s1.DefineField("a", typeof(int), FieldAttributes.Public); 
      s1.CreateType(); 
      ILGenerator ilGenerator = methodbuilder.GetILGenerator(); 
      ilGenerator.Emit(OpCodes.Ret); 
      Type helloWorldType = typeBuilder.CreateType(); 
      if (false) 
      { 
       // set the entry point for the application and save it 
       assemblyBuilder.SetEntryPoint(methodbuilder, PEFileKinds.ConsoleApplication); 
       assemblyBuilder.Save("HelloWorld.exe"); 
      } 
      else 
      { 
       assemblyBuilder.SetEntryPoint(methodbuilder, PEFileKinds.Dll); 
       assemblyBuilder.Save("HelloWorld.dll"); 
      } 
     } 
    } 
} 
+1

문제에 대해 자세히 설명해 주시겠습니까? 코드가 정확히 무엇을합니까? 무엇을 기대합니까? – svick

+0

'HelloWorld.dll'을 참조 할 수 있고'using Space; // 그것의 네임 스페이스'와'S1 mystruct '. –

답변

1

는 내가 정확히 당신이 요구하는 것을 이해 모르겠지만, 문제가 항상 HelloWorld.exe으로 모듈을 정의하고 있다는 생각합니다. 필요한 것은 모듈 이름이 파일 이름과 일치하는지 확인하는 것입니다.

어셈블리를 HelloWorld.dll으로 저장하려면 모듈 이름을 HelloWorld.dll으로 설정해야합니다.

+0

오 와우 그게 내가 완전히 'exe'가 두 곳에서 정의되었다는 것을 알지 못했다! 이제는 정의 된 이유가 궁금합니다 ('msdn DefineDynamicModule') –

+0

어셈블리 모듈이 별도의 파일 ('.netmodule')에있을 수 있기 때문입니다. – svick

+0

그래, 적어도 1000 번 이상 날 속였 어. –