2009-10-21 74 views
1

a。我的C#程序將加載一個dll(這是動態的),現在我們來看看a.dll(同樣,我的程序會加載更多dll,比如b.dll,c.dll等)。無法加載dll或其依賴項之一

b。我的程序將在a.dll中調用一個「Onstart」方法(對於所有的dll來說它是不變的)。

我能通過反射機制實現上述2種情況。

問題是

a。如果我的a.dll有任何參考說xx.dll或yy.dll,那麼當我嘗試調用

從我的程序的OnStart方法。我得到「無法加載dll或它的一個依賴項」。 見代碼段

Assembly assm = Assembly.LoadFrom(@"C:\Balaji\Test\a.dll"); 

foreach (Type tp in assm.GetTypes()) 
{ 
    if (tp.IsClass) 
    { 
     MethodInfo mi = tp.GetMethod("OnStart"); 

     if (mi != null) 
     { 
      object obj = Activator.CreateInstance(tp); 
      mi.Invoke(obj,null); 
      break; 
     } 
    } 
} 

通常我上線收到錯誤 「對象物obj = Activator.CreateInstance(TP);」這是因爲a.dll引用了xx.dll,但在我的程序中我沒有引用xx.dll。此外,我不能在我的程序中引用xx.dll,因爲a.dll是一個外部程序集,可以有任何自己的參考。

Kinldy help !!!

回答

0

也許第二個DLL引用不適用於您的應用程序?

確保第二個DLL與第一個DLL位於同一目錄中,或者應用程序配置爲在具有第二個DLL的目錄中查找。

0

我想,這需要更多的解釋。讓我解釋一下......

a。我的C#程序將加載一個dll(這是動態的),現在讓我們來看看a.dll(類似b.dll,c.dll等更多的DLL)。

b。我的程序將在a.dll中調用一個方法「Onstart」(它對所有dll都是常量)。

我能通過反射機制實現上述2種情況。

問題是

a。如果我的a.dll有任何參考說xx.dll或yy.dll,那麼當我嘗試調用

OnStart從我的程序的a.dll方法。我得到「無法加載dll或它的一個依賴項」。

見代碼段

Assembly assm = Assembly.LoadFrom(@"C:\Balaji\Test\a.dll"); 
foreach (Type tp in assm.GetTypes()) 
{ 
    if (tp.IsClass) 
    { 
     MethodInfo mi = tp.GetMethod("OnStart"); 
     if (mi != null) 
     { 
      object obj = Activator.CreateInstance(tp); 
      mi.Invoke(obj,null); 
      break; 
     } 
    } 
} 

通常我就行收到錯誤 「對象物obj = Activator.CreateInstance(TP);」 這是因爲a.dll引用了xx.dll,但我不能擁有相同的內容。 此外,我不能在我的程序中引用xx.dll,因爲a.dll是動態的,可以有任何自己的參考。

0

我覺得除了添加所有使用的引用之外,你不能做任何事情。 ps:通常外部組件應該是完整的使用(或包將包含所有需要的組件,以便您可以添加它們)

1

看看這個:http://bytes.com/topic/c-sharp/answers/232691-how-dynamically-load-assembly-w-dependencies。基本上,在AssemblyResolve事件中,您需要手動加載引用的程序集。

private Assembly AssemblyResolveHandler(object sender,ResolveEventArgs e) 
{ 
    try 
    { 
     string[] assemblyDetail = e.Name.Split(','); 
     string assemblyBasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
     Assembly assembly = Assembly.LoadFrom(assemblyBasePath + @"\" + assemblyDetail[0] + ".dll"); 
     return assembly; 
    } 
    catch (Exception ex) 
    { 
     throw new ApplicationException("Failed resolving assembly", ex); 
    } 
} 

不是最好的代碼,但應該給你一個大概的想法,我希望。

但是,我確實認爲應該將plugin-dll打包以實現完全無依賴性的使用。如果他們被允許加載程序集,那麼你無法控制,那麼誰知道會發生什麼。

相關問題