OBJECT Table 76101 .NET Assembly
{
  OBJECT-PROPERTIES
  {
    Date=05.11.15;
    Time=19:59:41;
    Modified=Yes;
    Version List=Vjeko.com.1.00;
  }
  PROPERTIES
  {
  }
  FIELDS
  {
    { 1   ;   ;Assembly Name       ;Text250       ;CaptionML=ENU=Assembly Name }
    { 2   ;   ;User ID             ;Code50        ;TableRelation=User."User Name";
                                                   OnValidate=VAR
                                                                UserMgt@1000 : Codeunit 418;
                                                              BEGIN
                                                                UserMgt.ValidateUserID("User ID");
                                                              END;

                                                   OnLookup=VAR
                                                              UserMgt@1000 : Codeunit 418;
                                                            BEGIN
                                                              UserMgt.LookupUserID("User ID");
                                                            END;

                                                   CaptionML=ENU=User ID }
    { 3   ;   ;Tier                ;Option        ;CaptionML=ENU=Tier;
                                                   OptionCaptionML=ENU=Both,Server,Client;
                                                   OptionString=Both,Server,Client }
    { 10  ;   ;Assembly            ;BLOB          ;CaptionML=ENU=Assembly }
  }
  KEYS
  {
    {    ;Assembly Name,User ID,Tier              ;Clustered=Yes }
  }
  FIELDGROUPS
  {
  }
  CODE
  {

    PROCEDURE InstallAssembly@3(VAR InStr@1000 : InStream;VAR Asm@1002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.Assembly";Name@1004 : Text);
    VAR
      Asmbl@1005 : Record 76101;
      MemStream@1001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.MemoryStream";
      OutStr@1003 : OutStream;
    BEGIN
      WITH Asmbl DO BEGIN
        MemStream := MemStream.MemoryStream();
        COPYSTREAM(MemStream,InStr);
        Asm := Asm.Load(MemStream.ToArray());

        IF Name = '' THEN BEGIN
          "Assembly Name" := Asm.FullName;
        END ELSE
          "Assembly Name" := Name;

        Assembly.CREATEOUTSTREAM(OutStr);
        MemStream.Seek(0,0);
        COPYSTREAM(OutStr,MemStream);

        IF INSERT() THEN
          MODIFY();
      END;
    END;

    BEGIN
    END.
  }
}

OBJECT Codeunit 76101 Assembly Resolver
{
  OBJECT-PROPERTIES
  {
    Date=05.11.15;
    Time=22:46:59;
    Modified=Yes;
    Version List=Vjeko.com.1.00;
  }
  PROPERTIES
  {
    SingleInstance=Yes;
    OnRun=VAR
            Asm@1010 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.Assembly";
            AsmClient@1000 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.Assembly" RUNONCLIENT;
            Object@1001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object";
          BEGIN
            RetrieveResolverAssembly(Asm);
            Object := Asm.CreateInstance(TypeName);

            ResolveServerSide(AssemblyName,Object);
            ResolverNst := Object;

            RetrieveResolverAssembly(AsmClient);
            ResolverRtc := AsmClient.CreateInstance(TypeName);

            ResolveAssemblies();
          END;

  }
  CODE
  {
    VAR
      ResolverNst@1000 : DotNet "'NavHelper.AssemblyResolver, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.NavHelper.AssemblyResolver.Resolver" WITHEVENTS;
      ResolverRtc@1001 : DotNet "'NavHelper.AssemblyResolver, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.NavHelper.AssemblyResolver.Resolver" RUNONCLIENT;
      CompilerError@1003 : TextConst 'ENU=Error compiling the resolver assembly:\\%1';
      AssemblyName@1004 : TextConst 'ENU="NavHelper.AssemblyResolver, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"';
      TypeName@1005 : TextConst 'ENU=NavHelper.AssemblyResolver.AssemblyResolver';

    LOCAL PROCEDURE ResolveAssemblies@6();
    VAR
      Asmbl@1000 : Record 76101;
    BEGIN
      WITH Asmbl DO BEGIN
        SETFILTER("User ID",'%1|%2','',USERID);
        IF FINDSET() THEN
          REPEAT
            IF Tier IN [Tier::Both,Tier::Client] THEN
              ResolveAssembly(Asmbl,ResolverRtc,Tier::Client);
            IF Tier IN [Tier::Both,Tier::Server] THEN
              ResolveAssembly(Asmbl,ResolverNst,Tier::Server);
          UNTIL NEXT = 0;
      END;
    END;

    LOCAL PROCEDURE ResolveServerSide@1(Name@1000 : Text;Resolver@1002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object");
    VAR
      Asmbl@1001 : Record 76101;
    BEGIN
      WITH Asmbl DO BEGIN
        SETRANGE("Assembly Name",Name);
        SETFILTER(Tier,'%1|%2',Tier::Both,Tier::Server);
        SETFILTER("User ID",'%1|%2','',USERID);
        IF FINDFIRST() THEN
          ResolveAssembly(Asmbl,Resolver,Tier::Server);
      END;
    END;

    LOCAL PROCEDURE ResolveAssembly@7(Asmbl@1000 : Record 76101;VAR Resolver@1007 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object";TargetTier@1003 : Integer);
    VAR
      Asm@1004 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.Assembly";
      Bytes@1008 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
      MemStr@1002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.MemoryStream";
      MethodInfo@1005 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.MethodInfo";
      MethodInfoClient@1010 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.MethodInfo" RUNONCLIENT;
      Params@1006 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
      ParamsClient@1009 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array" RUNONCLIENT;
      Object@1011 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Object";
      InStr@1001 : InStream;
    BEGIN
      LoadAssemblyBytes(Asmbl,Bytes);
      WITH Asmbl DO BEGIN
        CASE TargetTier OF
          Tier::Server:
            BEGIN
              MethodInfo := Resolver.GetType().GetMethod('ResolveAssembly');
              Params := Params.CreateInstance(GETDOTNETTYPE(Object),2);
              Params.SetValue("Assembly Name",0);
              Params.SetValue(Bytes,1);
              MethodInfo.Invoke(Resolver,Params);
            END;
          Tier::Client:
            BEGIN
              MethodInfoClient := Resolver.GetType().GetMethod('ResolveAssembly');
              ParamsClient := ParamsClient.CreateInstance(GETDOTNETTYPE(Object),2);
              ParamsClient.SetValue("Assembly Name",0);
              ParamsClient.SetValue(Bytes,1);
              MethodInfoClient.Invoke(Resolver,ParamsClient);
            END;
        END;
      END;
    END;

    LOCAL PROCEDURE LoadAssemblyBytes@65(Asmbl@1000 : Record 76101;VAR Bytes@1001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array");
    VAR
      MemStr@1004 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.MemoryStream";
      InStr@1003 : InStream;
      Byte@1002 : Byte;
    BEGIN
      WITH Asmbl DO BEGIN
        CALCFIELDS(Assembly);
        Assembly.CREATEINSTREAM(InStr);
        MemStr := MemStr.MemoryStream();
        COPYSTREAM(MemStr,InStr);
        Bytes := MemStr.ToArray();
      END;
    END;

    LOCAL PROCEDURE CompileResolverAssembly@56(VAR Asm@1004 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.Assembly");
    VAR
      CodeDomProvider@1003 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.CodeDom.Compiler.CodeDomProvider";
      CompilerParameters@1002 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.CodeDom.Compiler.CompilerParameters";
      CompilerResults@1001 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.CodeDom.Compiler.CompilerResults";
      Sources@1000 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
    BEGIN
      Sources := Sources.CreateInstance(GETDOTNETTYPE(''),1);
      Sources.SetValue(GetSource(),0);

      CodeDomProvider := CodeDomProvider.CreateProvider('CSharp');
      CompilerParameters := CompilerParameters.CompilerParameters();
      CompilerResults := CodeDomProvider.CompileAssemblyFromSource(CompilerParameters,Sources);
      IF CompilerResults.Errors.Count() > 0 THEN
        ERROR(CompilerError,CompilerResults.Errors.Item(0));

      InstallResolverAssembly(CompilerResults.PathToAssembly,Asm);
    END;

    LOCAL PROCEDURE InstallResolverAssembly@12(Path@1000 : Text;VAR Asm@1004 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.Assembly");
    VAR
      Asmbl@1003 : Record 76101;
      AsmFile@1001 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.File";
      MemStr@1002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.MemoryStream";
    BEGIN
      MemStr := MemStr.MemoryStream(AsmFile.ReadAllBytes(Path));
      Asmbl.InstallAssembly(MemStr,Asm,AssemblyName);
      ERASE(Path);
    END;

    LOCAL PROCEDURE RetrieveResolverAssembly@60(VAR Asm@1000 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.Assembly");
    VAR
      Asmbl@1001 : Record 76101;
      Bytes@1002 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
    BEGIN
      Asmbl."Assembly Name" := AssemblyName;
      IF Asmbl.FIND() THEN BEGIN
        LoadAssemblyBytes(Asmbl,Bytes);
        Asm := Asm.Load(Bytes);
      END ELSE
        CompileResolverAssembly(Asm);
    END;

    LOCAL PROCEDURE GetSource@54() Source : Text;
    BEGIN
      Source := 'using System;using System.Collections.Generic;using System.Reflection;namespace NavHelper.';
      Source += 'AssemblyResolver{public class AssemblyResolver{private readonly Dictionary<string,byte[]>_';
      Source += 'assemblies=new Dictionary<string,byte[]>();public event EventHandler<ResolveEventArgs>OnRe';
      Source += 'solveAssembly;public void ResolveAssembly(string name,byte[] asm){if(_assemblies.ContainsK';
      Source += 'ey(name))_assemblies.Remove(name);_assemblies.Add(name,asm);}public AssemblyResolver(){App';
      Source += 'Domain.CurrentDomain.AssemblyResolve+=(sender,args)=>{if(!_assemblies.ContainsKey(args.Nam';
      Source += 'e)&&OnResolveAssembly!=null)OnResolveAssembly.Invoke(sender,args);return _assemblies.Conta';
      Source += 'insKey(args.Name)?Assembly.Load(_assemblies[args.Name]):null;};}}}';
    END;

    EVENT ResolverNst@1000::OnResolveAssembly@10(sender@1001 : Variant;e@1000 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.ResolveEventArgs");
    BEGIN
      ResolveServerSide(e.Name,ResolverNst);
    END;

    BEGIN
    END.
  }
}

OBJECT Page 76101 .NET Assemblies
{
  OBJECT-PROPERTIES
  {
    Date=06.11.15;
    Time=10:52:43;
    Modified=Yes;
    Version List=Vjeko.com.1.00;
  }
  PROPERTIES
  {
    SourceTable=Table76101;
    PageType=List;
    ActionList=ACTIONS
    {
      { 7       ;    ;ActionContainer;
                      ActionContainerType=ActionItems }
      { 8       ;1   ;Action    ;
                      Ellipsis=Yes;
                      CaptionML=ENU=Import Assembly...;
                      Promoted=Yes;
                      PromotedIsBig=Yes;
                      Image=ImportDatabase;
                      PromotedCategory=Process;
                      OnAction=BEGIN
                                 ImportAssembly();
                               END;
                                }
    }
  }
  CONTROLS
  {
    { 1   ;0   ;Container ;
                ContainerType=ContentArea }

    { 2   ;1   ;Group     ;
                Name=Group;
                GroupType=Repeater }

    { 3   ;2   ;Field     ;
                SourceExpr="Assembly Name" }

    { 4   ;2   ;Field     ;
                SourceExpr="User ID" }

    { 5   ;2   ;Field     ;
                SourceExpr=Tier }

  }
  CODE
  {

    PROCEDURE ImportAssembly@2();
    VAR
      TempBlob@1002 : Record 99008535;
      FileManagement@1001 : Codeunit 419;
      Asm@1003 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Reflection.Assembly";
      InStr@1006 : InStream;
      FileName@1000 : Text;
      AllFilesTxt@1009 : TextConst 'ENU=All Files';
      ImportFileTxt@1008 : TextConst 'ENU=.NET Assembly';
      ImportTitleTxt@1005 : TextConst 'ENU=Import .NET Assembly';
    BEGIN
      FileName := FileManagement.BLOBImportWithFilter(
        TempBlob,ImportTitleTxt,'',
        ImportFileTxt + ' (*.dll)|*.dll|' + AllFilesTxt + ' (*.*)|*.*','*.*');

      IF FileName <> '' THEN BEGIN
        TempBlob.Blob.CREATEINSTREAM(InStr);
        InstallAssembly(InStr,Asm,'');
        CurrPage.UPDATE(FALSE);
      END;
    END;

    BEGIN
    END.
  }
}

