2014-01-14 6 views
2

Я связал, чтобы создать простую программу Console App C# .NET 4.0 для загрузки DLL-файла удаленно. Мой код работает, как ожидалось, при загрузке dll, что на локальном компьютере, но у меня возникла проблема с решением dll при попытке загрузить удаленно. Я понятия не имею, как справиться с этим, так как я не могу найти какой-либо пример кода, который удаляет DLL удаленно.Как загрузить .NET DLL удаленно в новый AppDomain

Ошибка, которую я получил, как показано ниже.

Could not load file or assembly 'http://codesanook.cloudapp.net/dll/ZupZip.Lib.I 
nterfaces.dll' or one of its dependencies. Operation is not supported. (Exceptio 
n from HRESULT: 0x80131515) 
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String cod 
eBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& 
stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntro 
spection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String code 
Base, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& s 
tackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntros 
pection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName as 
semblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMar 
k& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIn 
trospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Ev 
idence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, 
Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackM 
ark) 
    at System.Reflection.Assembly.LoadFrom(String assemblyFile) 
    at LoadDllRemotely.Proxy.GetObject[T](String assemblyPath, String fullTypeNam 
e, String[] referencedAssembliesPath) in C:\Projects\LoadDllRemotely\LoadDllRemo 
tely\Program.cs:line 102 

Unhandled Exception: System.NullReferenceException: Object reference not set to 
an instance of an object. 
    at LoadDllRemotely.Program.LoadRemotely() in C:\Projects\LoadDllRemotely\Load 
DllRemotely\Program.cs:line 74 
    at LoadDllRemotely.Program.Main(String[] args) in C:\Projects\LoadDllRemotely 
\LoadDllRemotely\Program.cs:line 28 
Press any key to continue . . . 

Это моя реализация, что загрузить DLL удаленно с помощью новой AppDomain

using System; 
using System.IO; 
using System.Reflection; 
using ZupZip.Lib.Interfaces; 

namespace LoadDllRemotely 
{ 
    public class Program 
    { 
     private const string ASSEMBLY_PATH = 
         @"C:\Projects\LoadDllRemotely\ZupZip.Lib\bin\Debug\ZupZip.Lib.dll"; 
     private const string ASSEMBLY_URL = 
         @"http://codesanook.cloudapp.net/dll/ZupZip.Lib.dll"; 

     private const string REFERENCED_ASSEMBLY3_URL = 
       @"http://codesanook.cloudapp.net/dll/ZupZip.Lib.Interfaces.dll"; 

     private const string REFERENCED_ASSEMBLY2_URL = 
       @"http://codesanook.cloudapp.net/dll/system.core.dll"; 


     private const string REFERENCED_ASSEMBLY1_URL = 
       @"http://codesanook.cloudapp.net/dll/mscorlib.dll"; 

     public static void Main(string[] args) 
     { 
      //LoadLocally(); 
      LoadRemotely(); 
     } 

     public static void appDomain_DomainUnload(object sender, EventArgs e) 
     { 
      Console.WriteLine("domain loaded sender: {0}", 
       sender.GetType().FullName); 
     } 


     public static void LoadLocally() 
     { 
      var appDomain = AppDomain.CreateDomain("dynamicDll"); 
      appDomain.DomainUnload += new EventHandler(appDomain_DomainUnload); 
      var proxy = (Proxy)appDomain.CreateInstanceAndUnwrap(
       typeof(Proxy).Assembly.FullName, 
       typeof(Proxy).FullName); 

      var calculator = proxy.GetObject<IGradeCalculator>(
       ASSEMBLY_PATH, 
       "ZupZip.Lib.GradeCalculator"); 
      var score = 80; 
      Console.WriteLine("you got grad: {0} from score: {1}", calculator.GetGradeForScore(score), score); 

      AppDomain.Unload(appDomain); 

      File.Delete(ASSEMBLY_PATH);//you can delete referece dll after remove 
     } 


     public static void LoadRemotely() 
     { 
      //app domain setup 
      //load as byte array 
      var appDomain = AppDomain.CreateDomain("dynamicDll"); 
      appDomain.DomainUnload += new EventHandler(appDomain_DomainUnload); 

      var proxy = (Proxy)appDomain.CreateInstanceAndUnwrap(
       typeof(Proxy).Assembly.FullName, 
       typeof(Proxy).FullName); 

      var calculator = proxy.GetObject<IGradeCalculator>(
       ASSEMBLY_URL, 
       "ZupZip.Lib.GradeCalculator", 
       REFERENCED_ASSEMBLY3_URL); 
      var score = 80; 
      Console.WriteLine("you got grad: {0} from score: {1}", calculator.GetGradeForScore(score), score); 

      AppDomain.Unload(appDomain); 

     } 

    } 

    public class Proxy : MarshalByRefObject 
    { 
     public T GetObject<T>(
      string assemblyPath, 
      string fullTypeName, 
      params string[] referencedAssembliesPath) where T : class 
     { 
      try 
      { 
       //find reference 
       var assemblyToLoad = Assembly.ReflectionOnlyLoadFrom(assemblyPath); 
       AssemblyName[] referencedAssemblies = assemblyToLoad.GetReferencedAssemblies(); 
       //foreach (var referencedAssembly in referencedAssemblies) 
       //{ 
       // Console.WriteLine("referenceAssemblyName: {0}", referencedAssembly.Name); 
       // Assembly.Load(referencedAssembly.Name); 
       //} 
       //solve reference assembly 
       foreach (var referencedAssemblyPath in referencedAssembliesPath) 
       { 
        Assembly.LoadFrom(referencedAssemblyPath); 
       } 

       //this dll will load in new domain 
       var assembly = Assembly.LoadFrom(assemblyPath); 
       var type = assembly.GetType(fullTypeName); 
       var obj = (T)Activator.CreateInstance(type); 
       return obj; 
      } 
      catch (Exception ex) 
      { 
       // throw new InvalidOperationException(ex); 
       Console.WriteLine(ex.Message); 
       Console.WriteLine(ex.StackTrace); 
       return null; 
      } 
     } 

    } 

} 

Я также добавить этот исходный код для моего открытого источника на Bitbuckget

enter link description here

+1

«У меня проблема DLL решимость при попытке загрузить удаленно.» И эта проблема была? Пожалуйста, укажите полный текст любых сообщений об ошибках, которые вы получили, или объясните непредвиденное поведение. Также почему вы ссылаетесь на 'system.core.dll' и' mscorlib.dll' удаленно? –

+0

@ScottChamberlain Большое спасибо за ваш комментарий. Я добавляю дополнительную информацию, которую вы предлагаете мне. Надеюсь, если у вас есть время, пожалуйста, скачайте мой проект и помогите мне решить эту проблему. Еще раз спасибо. – theeranitp

+0

Обратите внимание, что .NET Remoting [прекращено] (https://www.infoq.com/news/2016/02/Core-Discontinued) в .NET Core. – orad

ответ

1

Fixed просто добавить эта конфигурация для App.Config для полного доверия

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <runtime> 
     <loadFromRemoteSources enabled="true"/> 
    </runtime> 
</configuration> 

и я также обновить этот код на

https://bitbucket.org/theeranitp/loaddllremotely