2011-02-12 87 views
3

在找到答案之後,我在程序集解析(AppDomain.CurrentDomain.AssemblyResolve asking for a <AppName>.resources assembly?)上的最後一個問題現在我可以在我的程序中嵌入引用程序集,但是這不會以某種方式工作。CurrentDomain.AssemblyResolve無法解析'一些'程序集

首先我安裝在我的Program.cs的第一個入口我的程序集解析器

// attach our embedded assembly loader. 
    AppDomain.CurrentDomain.AssemblyResolve += AssemblyManager.Instance.Resolver; 

這裏是我的實際分解;

public Assembly Resolver(object sender, ResolveEventArgs args) 
{ 
    AssemblyName askedAssembly = new AssemblyName(args.Name); 

    lock (this) 
    { 
     Assembly assembly; 

     string resourceName = string.Format("Assets.Assemblies.{0}.dll", askedAssembly.Name); 
     using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) 
     { 
      if (stream == null) 
      { 
       LogManager.Instance.Write(LogMessageTypes.Fatal, string.Format("Can not resolve asked assembly: {0}", askedAssembly.Name)); 
       MessageBox.Show(i18n.CanNotLoadRequiredAssembliesMessage, i18n.CanNotLoadRequiredAssembliesTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 
       Environment.Exit(-1); 
      } 

      byte[] assemblyData = new byte[stream.Length]; 
      stream.Read(assemblyData, 0, assemblyData.Length); 
      assembly = Assembly.Load(assemblyData); 
     } 

     LogManager.Instance.Write(LogMessageTypes.Trace, "Loaded embedded assembly: " + askedAssembly.Name); 

     return assembly; 
    } 
} 

現在我的程序引用這些庫程序集。

  • Esent.Collections.dll
  • Esent.Interop.dll
  • HtmlAgilityPack.dll
  • Ionic.Zip.Reduced.dll
  • System.Windows.Forms.Calendar.dll
  • AxInterop.ShockwaveFlashObjects
  • Interop.ShockwaveFlashObjects
  • irrKlang.NET4。 dll的
  • ikpMP3.dll
  • Nini.dll(解決)

利用上述我的分解器;我可以嵌入Esent.Collections,Esent.Interop,HtmlAgilityPack,Ionic.Zip.Reduced,System.Windows.Forms.Calendar,AxInterop.ShockwaveFlashObjects,Interop.ShockwaveFlashObjects並在運行時解決這些問題。

問題出現在irrKlang.NET.4,Nini和ShockwaveFlash程序集中,如果我嘗試嵌入這些程序集並嘗試在運行時解決它們,我遇到了問題。

對於irrKlang我可以理解爲irrKlang.NET4程序集引用非託管ikpMP3.dll,我無法找到它自己的問題。

對於Nini.dll,實際上我可以嵌入此程序集並使用VS調試/發佈配置運行它只是工作正常,但是當我從資源管理器啓動程序,我自己的程序只是拒絕啓動(沒有錯誤或任何信息)。

任何幫助表示讚賞。

更新 現在,感謝Marc Gravell的回答,我可以加載Nini.dll。

對於irrKlang部分,因爲irrKlang.NET4.dll是一個託管程序集,它需要ikpMp3.dll - 非託管程序 - 如果我嘗試在運行時解析irrKlang.NET4.dll,它可以訪問它所需的依賴關係ikpMp3。有沒有解決這個問題?

+0

你使用`Main`方法中的任何類型嗎?它必須能夠完全JIT`Main`來啓動應用程序... – 2011-02-12 23:17:30

+0

Nini.dll實際上是從Main方法訪問的。我會試一試並將其移開。 – HuseyinUslu 2011-02-12 23:20:13

回答

4

這裏的一個常見問題是在您有機會註冊assembly-resolve事件之前使用這些類型。特別要注意的是,系統必須能夠在運行一個方法之前,能夠運行一個方法,包括Main(),才能運行啓動

所以如果你的入口點(Main())做事件掛鉤會談問題的類型,它會嘗試解決類型(JIT)以前或有機會認購。

做主要的最小值;將「真實」代碼移到另一個方法中,只有在事件被明確訂閱後纔會調用該方法。

例如:

static void Main() { 
    SubscribeAssemblyResolver(); 
    ExecuteApplication(); 
} 

在極端情況下,你甚至可能需要使用MethodImplAttribute禁用上述方法的內聯。