2013-01-04 52 views
0

我想從一個dll找到公共用戶定義的函數時publickeytoken == null使用C#公鑰時如何獲得公衆的方法從DLL的== NULL

OpenFileDialog obj = new OpenFileDialog(); 
if (obj.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
{ 
    Assembly ass = Assembly.LoadFrom(obj.FileName); 

    // Here its getting Exception because Publickeytoken == null; 
    Assembly a = Assembly.LoadWithPartialName(ass.FullName); 

    Type[] types = a.GetTypes(); 
    foreach (Type type in types) 
    { 
     if (!type.IsPublic) 
     { 
      continue; 
     } 

     MemberInfo[] members = type.GetMembers(BindingFlags.Public 
               | BindingFlags.Instance 
               | BindingFlags.InvokeMethod); 
     foreach (MemberInfo member in members) 
     { 
      Console.WriteLine(type.Name + "." + member.Name); 
     } 
    } 
} 

如何解決這個

即使我嘗試這樣查找publictokenkey它retruns 0字節

  byte[] b = Assembly.GetExecutingAssembly().GetName().GetPublicKeyToken(); 
+0

什麼是你的例外?此外,LoadWithPartialName已過時,您應該使用Load來代替。 – ryadavilli

+0

爲什麼不直接使用組件對象「ass」?既然你剛剛從DLL加載它? – bashmohandes

+0

好吧告訴我一個解決方案,找到公共方法從Dll – Aravind

回答

1

你結合的標誌是錯誤的,你可以直接使用ass

OpenFileDialog obj = new OpenFileDialog(); 
if (obj.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
{ 
    Assembly ass = Assembly.LoadFrom(obj.FileName); 
    foreach(var type in ass.GetTypes()) 
    { 
     MethodInfo[] members = type.GetMethods(BindingFlags.Public | BindingFlags.Instance); 

     foreach (MemberInfo member in members) 
     { 
      Console.WriteLine(type.Name + "." + member.Name); 
     } 
    } 
} 
+0

對於某些Dll其工作...有些不工作?我能做什麼 – Aravind

+0

我得到了這個看到這個消息的結尾,以獲取調用 即時(JIT)調試的細節,而不是這個對話框。 – Aravind

+0

**************例外文本************** System.Reflection.ReflectionTypeLoadException:無法加載一個或多個請求的類型。檢索LoaderExceptions屬性以獲取更多信息。您可以在System.Reflection.RuntimeModule.GetTypes() System.Reflection.Assembly.GetTypes() – Aravind