HOWTO Implement LoadLibrary, GetProcAdress, and FreeLibrary.
Below is code that I want to be able to use simple
LoadLibrary\Get ProcAddress\Fre eLibrary technqiues on. I've used the code that
was initially placed on the .NET 247 forum as such:
http://dotnet247.com/247reference//msgs/28/140461.aspx
I have expanded it here to let one call any/all kinds of functions. The idea
is that a "MASTER" Invoke function takes arrays that explain everything
needed to be able to call functionality as one desires, while overloaded
version of "Invoke" that are prepped for the means\design we wish to cal them
as build the arrays as need be. If anyone would please, help me fill in the
blanks as denoted by the various "????" spots.
=============== =====
using System;
using System.Collecti ons;
using System.Componen tModel;
using System.Drawing;
using System.Data;
using System.Windows. Forms;
using System.IO;
using System.Net;
using System.Reflecti on;
using System.Reflecti on.Emit;
using System.Runtime. InteropServices ;
namespace MyNameSpace
{
public class MyClass
{
[DllImport("kern el32.dll")]
static extern IntPtr LoadLibrary(str ing csFileName);
[DllImport("kern el32.dll")]
static extern IntPtr GetProcAddress( IntPtr IntPtr_Module, string
csProcName);
[DllImport("kern el32.dll")]
static extern bool FreeLibrary(Int Ptr IntPtr_Module);
public main()
{
IntPtr IntPtr_MyLib = LoadLibrary("My Lib.dll");
IntPtr IntPtr_MyFunc = GetProcAddress( IntPtr_MyLib, "MyFunc");
string csRET = Invoke(IntPtr_M yFunc, "Param #1", "Param #2");
FreeLibrary(Int Ptr_MyFunc);
}
public static string Invoke(IntPtr IntPtr_Function , string csParam1,
string csParam2)
{
object[] zobject_Paramet ers = new object[]
{
csParam1,
csParam2
};
Type[] zType_Parameter Types = new Type[]
{
typeof(string),
typeof(string)
};
String[] zcsParameterTyp es = new String[]
{
"string",
"string"
};
Type Type_Return = typeof(string);
return (string) Invoke
(
IntPtr_Function ,
zobject_Paramet ers,
zType_Parameter Types,
zcsParameterTyp es,
Type_Return
);
}
public static object Invoke
(
IntPtr IntPtr_Function ,
object[] zobject_Paramet ers,
Type[] zType_Parameter Types,
String[] zcsParameterTyp es,
Type Type_Return
)
{
AssemblyName AssemblyName_Th is = new AssemblyName();
AssemblyName_Th is.Name = "Invokable" ;
AssemblyBuilder AssemblyBuilder _This =
AppDomain.Curre ntDomain.Define DynamicAssembly
(
AssemblyName_Th is,
AssemblyBuilder Access.Run
);
ModuleBuilder ModuleBuilder_T his =
AssemblyBuilder _This.DefineDyn amicModule
(
"CInvoker"
);
MethodBuilder MethodBuilder_T his = ModuleBuilder_T his.DefineGloba lMethod
(
"Invoker",
MethodAttribute s.Public | MethodAttribute s.Static,
Type_Return,
zType_Parameter Types
);
ILGenerator ILGenerator_Thi s = MethodBuilder_T his.GetILGenera tor();
int i;
OpCode OpCode_Integer;
if (IntPtr.Size == 4)
{
OpCode_Integer = OpCodes.Ldc_I4;
}
else if (IntPtr.Size == 8)
{
OpCode_Integer = OpCodes.Ldc_I8;
}
else
{
throw new PlatformNotSupp ortedException( );
}
for (i = 0; i < zobject_Paramet ers.Length; i++)
{
switch (zcsParameterTy pes[i])
{
case "sbyte":
ILGenerator_Thi s.Emit(????, (sbyte) zobject_Paramet ers[i]);
break;
case "byte":
ILGenerator_Thi s.Emit(????, (byte) zobject_Paramet ers[i]);
break;
case "char":
ILGenerator_Thi s.Emit(????, (char) zobject_Paramet ers[i]);
break;
case "short":
ILGenerator_Thi s.Emit(????, (short) zobject_Paramet ers[i]);
break;
case "ushort":
ILGenerator_Thi s.Emit(????, (ushort) zobject_Paramet ers[i]);
break;
case "int":
ILGenerator_Thi s.Emit(OpCode_I nteger, (int)
zobject_Paramet ers[i]);
break;
case "uint":
ILGenerator_Thi s.Emit(OpCode_I nteger, (uint)
zobject_Paramet ers[i]);
break;
case "long":
ILGenerator_Thi s.Emit(OpCodes. Ldc_I8, (long)
zobject_Paramet ers[i]);
break;
case "ulong":
ILGenerator_Thi s.Emit(OpCodes. Ldc_I8, (ulong)
zobject_Paramet ers[i]);
break;
case "float":
ILGenerator_Thi s.Emit(OpCodes. Ldc_R4, (float)
zobject_Paramet ers[i]);
break;
case "double":
ILGenerator_Thi s.Emit(OpCodes. Ldc_R8, (double)
zobject_Paramet ers[i]);
break;
case "string":
ILGenerator_Thi s.Emit(????OpCo des.Ldstr, (string)
zobject_Paramet ers[i]);
break;
case "StringBuilder" :
ILGenerator_Thi s.Emit(????OpCo des.Ldstr, (StringBuilder)
zobject_Paramet ers[i]);
break;
default:
throw
(
new Exception
(
"The parameter #" + i.ToString() + " is not a valid type for
invocation"
)
);
break;
}
}
ILGenerator_Thi s.EmitCalli
(
OpCodes.Calli,
CallingConventi on.StdCall,
Type_Return,
zType_Parameter s
);
ILGenerator_Thi s.Emit(OpCodes. Ret);
ModuleBuilder_T his.CreateGloba lFunctions();
MethodInfo MethodInfo_This = ModuleBuilder_T his.GetMethod(" Invoker");
return MethodInfo_This .Invoke(null, zobject_Paramet ers);
}
}
}