Loading Managed DLLs or Assemblies

Source: Correct way to load assembly

If you do not have access to the TestRunner type information in the calling assembly (it sounds like you may not), you can call the method like this:

Assembly assembly = Assembly.LoadFile(@"C:\dyn.dll");
Type     type     = assembly.GetType("TestRunner");
var      obj      = Activator.CreateInstance(type);
 
// Alternately you could get the MethodInfo for the TestRunner.Run method
type.InvokeMember("Run", 
                  BindingFlags.Default | BindingFlags.InvokeMethod, 
                  null,
                  obj,
                  null);

If you have access to the IRunnable interface type, you can cast your instance to that (rather than the TestRunner type, which is implemented in the dynamically created or loaded assembly, right?):

  Assembly assembly  = Assembly.LoadFile(@"C:\dyn.dll");  // @ = static string, i.e. no special char interpretation in the following string
  Type     type      = assembly.GetType("TestRunner");
  IRunnable runnable = Activator.CreateInstance(type) as IRunnable;
  if (runnable == null) throw new Exception("broke");
  runnable.Run();
Loading Unmanaged DLLs

Create a library wrapper to reference from your managed code.

  • Import library function signatures. Open a Visual Studio Command Prompt and issue this command:
    C:\> dumpbin /exports MyLib.dll

    This outputs:

    Dump of file MyLib.dll
    
    File Type: DLL
    
      Section contains the following exports for MyLib.dll
    
        00000000 characteristics
               0 time date stamp Wed Dec 31 19:00:00 1969
            0.00 version
               1 ordinal base
              17 number of functions
              17 number of names
    
        ordinal hint RVA      name
    
              1    0 00010D4C Initialize
              2    1 00010D5C ActivateDevice
             15    2 000112F8 OpenPort
              4    3 00010F94 ClosePort
             14    4 000111F4 GetDebugStatus
             12    5 0001131C GetFcomVersion
             11    6 00010FCC GetNoPollTimeout
             17    7 000113B0 GetPortMode
              5    8 0001102C GetPortStatus
              9    9 00010E98 GetRspArray
             13    A 0001133C MaxComPort
              3    B 00010ECC OpenPort
              8    C 00010E74 RspReady
              7    D 00010E40 SendCmdArray
              6    E 00010D6C SendReady
             10    F 00011004 SetNoPollTimeout
             16   10 0001135C SetPortMode
    
      Summary
    
            1000 .edata
            1000 .idata
            2000 .reloc
            2000 .rsrc
            2000 BSS
           11000 CODE
            1000 DATA
  • Create wrapper with each function name found with dumpbin using DllImport:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
     
    namespace AHI.Testing.Frye
    {
        public class MyLib_DLL_Wrapper
        {
            private const String DLL_NAME = "MyLib.dll";  // DLL
            [DllImport(DLL_NAME, EntryPoint = "OpenPort")]
            public static extern int OpenPort(ref int portNum);
     
            [DllImport(DLL_NAME, EntryPoint = "ClosePort")]
            public static extern int ClosePort(ref int portNum);
            ...
        }
    }