Пример #1
0
        public void testdll()
        {
            int     ret   = 0;
            LoadDll myDLD = new LoadDll();

            myDLD.LoadDll2("xxx.dll");
            myDLD.LoadFun("InitSDK");
            object[] Parameters = new object[] { };
            // 实参为0
            Type[] ParameterTypes = new Type[] { };
            // 实参类型为int
            ModePass[] themode = new ModePass[] { };
            // 传送方式为值传
            Type Type_Return = typeof(int);

            // 返回类型为int
            ret = (int)myDLD.Invoke(Parameters, ParameterTypes, themode, Type_Return);
            //txRet.Text = ret.ToString();
            if (ret != 1)
            {
                //MessageBox.Show("InitSDK failed !");
            }
            if (ret == 1)
            {
                //MessageBox.Show("InitSDK Sucessed !");
            }
        }
Пример #2
0
 public void testdll()
 {
     int ret = 0;
     LoadDll myDLD = new LoadDll();
     myDLD.LoadDll2("xxx.dll");
     myDLD.LoadFun("InitSDK");
     object[] Parameters = new object[] { };
     // 实参为0
     Type[] ParameterTypes = new Type[] { };
     // 实参类型为int
     ModePass[] themode = new ModePass[] { };
     // 传送方式为值传
     Type Type_Return = typeof(int);
     // 返回类型为int
     ret = (int)myDLD.Invoke(Parameters, ParameterTypes, themode, Type_Return);
     //txRet.Text = ret.ToString();
     if (ret != 1)
     {
         //MessageBox.Show("InitSDK failed !");
     }
     if (ret == 1)
     {
         //MessageBox.Show("InitSDK Sucessed !");
     }
 }
Пример #3
0
        //not success
        static void TestComplexDllReflection()
        {
            Console.WriteLine("Complex:Use DllLoadLibrary&Reflection,");
            PrintCurrentProcessMemUsage();
            UseDllByReflection reflectFun = new UseDllByReflection();

            reflectFun.LoadDll("testCppDll.dll");
            reflectFun.LoadFun("CreateNameEntityByTypeByReturn");

            //NameEntity a = new NameEntity();
            int a = 0;

            unsafe
            {
                object[]   Parameters     = new object[] { a };
                Type[]     ParameterTypes = new Type[] { typeof(int) };
                ModePass[] themode        = new ModePass[] { ModePass.ByRef };
                Type       Type_Return    = typeof(IntPtr);
                string     methodName1    = "CreateNameEntityByTypeByReturn";
                object     ret            = reflectFun.Invoke(methodName1, Parameters, ParameterTypes, themode, Type_Return);
                IntPtr     retPtr         = (IntPtr)ret;
                NameEntity retStruct      = (NameEntity)Marshal.PtrToStructure(retPtr, typeof(NameEntity));
                //在非托管代码中使用CoTaskMemAlloc分配的内存,可以使用Marshal.FreeCoTaskMem方法释放
                Marshal.FreeCoTaskMem(retPtr);
                Console.WriteLine("非托管函数返回的结构体数据:double = {0:f6}, int = {1}",
                                  retStruct._score, retStruct._highlightLength);
            }
            reflectFun.UnLoadDll();

            reflectFun.LoadDll("testCppDll.dll");
            reflectFun.LoadFun("CreateNameEntityByType");

            NameEntity nameEntity = new NameEntity();
            IntPtr     paraPtr    = Marshal.AllocHGlobal(Marshal.SizeOf(nameEntity));

            Marshal.StructureToPtr(nameEntity, paraPtr, false);
            uint b = 0;

            unsafe
            {
                object[]   Parameters     = new object[] { paraPtr, b };
                Type[]     ParameterTypes = new Type[] { typeof(IntPtr), typeof(uint) };
                ModePass[] themode        = new ModePass[] { ModePass.ByRef, ModePass.ByValue };
                Type       Type_Return    = typeof(bool);
                string     methodName2    = "CreateNameEntityByType";
                object     ret            = reflectFun.Invoke(methodName2, Parameters, ParameterTypes, themode, Type_Return);
                NameEntity retStruct      = (NameEntity)Marshal.PtrToStructure(paraPtr, typeof(NameEntity));
                //在非托管代码中使用CoTaskMemAlloc分配的内存,可以使用Marshal.FreeCoTaskMem方法释放
                Marshal.FreeCoTaskMem(paraPtr);
                Console.WriteLine("非托管函数返回的结构体数据:double = {0:f6}, int = {1}",
                                  retStruct._score, retStruct._highlightLength);
            }
            reflectFun.UnLoadDll();
            PrintCurrentProcessMemUsage();
            Console.WriteLine("Complex: End");
        }
Пример #4
0
        private void btoLockingLrc_Click(object sender, EventArgs e)
        {
            object[]   Parameters     = new object[] { };
            Type[]     ParameterTypes = new Type[] { };
            ModePass[] themode        = new ModePass[] { };
            Type       Type_Return    = typeof(void);

            lrc_fun.LoadFun("LockingLRC");
            lrc_fun.Invoke(Parameters, ParameterTypes, themode, Type_Return);
        }
Пример #5
0
 // <summary>
 /// �������趨�ĺ���
 /// </summary>
 /// <param name="ObjArray_Parameter"> ʵ�� </param>
 /// <param name="TypeArray_ParameterType"> ʵ������ </param>
 /// <param name="ModePassArray_Parameter"> ʵ�δ��ͷ�ʽ </param>
 /// <param name="Type_Return"> �������� </param>
 /// <returns> ���������ú����� object</returns>
 public object Invoke(object[] ObjArray_Parameter, Type[] TypeArray_ParameterType, ModePass[] ModePassArray_Parameter, Type Type_Return)
 {
     // ���� 3 �� if �ǽ��а�ȫ��� , �����ͨ�� , ���׳��쳣
     if (hModule == IntPtr.Zero)
         throw (new Exception(" ������ģ��ľ��Ϊ�� , ��ȷ���ѽ��� LoadDll ���� !"));
     if (farProc == IntPtr.Zero)
         throw (new Exception(" ����ָ��Ϊ�� , ��ȷ���ѽ��� LoadFun ���� !"));
     if (ObjArray_Parameter.Length != ModePassArray_Parameter.Length)
         throw (new Exception(" �����������䴫�ݷ�ʽ�ĸ�����ƥ�� ."));
     // �����Ǵ��� MyAssemblyName ���������� Name ����
     AssemblyName MyAssemblyName = new AssemblyName();
     MyAssemblyName.Name = "InvokeFun";
     // ���ɵ�ģ�����
     AssemblyBuilder MyAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(MyAssemblyName, AssemblyBuilderAccess.Run);
     ModuleBuilder MyModuleBuilder = MyAssemblyBuilder.DefineDynamicModule("InvokeDll");
     // ����Ҫ���õķ��� , ������Ϊ�� MyFun �������������ǡ� Type_Return �����������ǡ� TypeArray_ParameterType ��
     MethodBuilder MyMethodBuilder = MyModuleBuilder.DefineGlobalMethod("MyFun", MethodAttributes.Public | MethodAttributes.Static, Type_Return, TypeArray_ParameterType);
     // ��ȡһ�� ILGenerator �����ڷ�������� IL
     ILGenerator IL = MyMethodBuilder.GetILGenerator();
     int i;
     for (i = 0; i < ObjArray_Parameter.Length; i++)
     {// ��ѭ������������ѹ���ջ
         switch (ModePassArray_Parameter[i])
         {
             case ModePass.ByValue:
                 IL.Emit(OpCodes.Ldarg, i);
                 break;
             case ModePass.ByRef:
                 IL.Emit(OpCodes.Ldarga, i);
                 break;
             default:
                 throw (new Exception(" �� " + (i + 1).ToString() + " ������û�и�����ȷ�Ĵ��ݷ�ʽ ."));
         }
     }
     if (IntPtr.Size == 4)
     {// �жϴ���������
         IL.Emit(OpCodes.Ldc_I4, farProc.ToInt32());
     }
     else if (IntPtr.Size == 8)
     {
         IL.Emit(OpCodes.Ldc_I8, farProc.ToInt64());
     }
     else
     {
         throw new PlatformNotSupportedException();
     }
     IL.EmitCalli(OpCodes.Calli, CallingConvention.StdCall, Type_Return, TypeArray_ParameterType);
     IL.Emit(OpCodes.Ret); // ����ֵ
     MyModuleBuilder.CreateGlobalFunctions();
     // ȡ�÷�����Ϣ
     MethodInfo MyMethodInfo = MyModuleBuilder.GetMethod("MyFun");
     return MyMethodInfo.Invoke(null, ObjArray_Parameter);// ���÷�������������ֵ
 }
Пример #6
0
 /// <summary>
 /// 调用所设定的函数
 /// </summary>
 /// <param name="ObjArray_Parameter"> 实参 </param>
 /// <param name="TypeArray_ParameterType"> 实参类型 </param>
 /// <param name="ModePassArray_Parameter"> 实参传送方式 </param>
 /// <param name="Type_Return"> 返回类型 </param>
 /// <returns> 返回所调用函数的 object</returns>
 public object Invoke(object[] ObjArray_Parameter, Type[] TypeArray_ParameterType, ModePass[] ModePassArray_Parameter, Type Type_Return)
 {
     // 下面 3 个 if 是进行安全检查 , 若不能通过 , 则抛出异常
     if (hModule == IntPtr.Zero)
         throw (new Exception(" 函数库模块的句柄为空 , 请确保已进行 LoadDll 操作 !"));
     if (farProc == IntPtr.Zero)
         throw (new Exception(" 函数指针为空 , 请确保已进行 LoadFun 操作 !"));
     if (ObjArray_Parameter.Length != ModePassArray_Parameter.Length)
         throw (new Exception(" 参数个数及其传递方式的个数不匹配 ."));
     // 下面是创建 MyAssemblyName 对象并设置其 Name 属性
     AssemblyName MyAssemblyName = new AssemblyName();
     MyAssemblyName.Name = "InvokeFun";
     // 生成单模块配件
     AssemblyBuilder MyAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(MyAssemblyName, AssemblyBuilderAccess.Run);
     ModuleBuilder MyModuleBuilder = MyAssemblyBuilder.DefineDynamicModule("InvokeDll");
     // 定义要调用的方法 , 方法名为“ MyFun ”,返回类型是“ Type_Return ”参数类型是“ TypeArray_ParameterType ”
     MethodBuilder MyMethodBuilder = MyModuleBuilder.DefineGlobalMethod("MyFun", MethodAttributes.Public | MethodAttributes.Static, Type_Return, TypeArray_ParameterType);
     // 获取一个 ILGenerator ,用于发送所需的 IL
     ILGenerator IL = MyMethodBuilder.GetILGenerator();
     int i;
     for (i = 0; i < ObjArray_Parameter.Length; i++)
     {// 用循环将参数依次压入堆栈
         switch (ModePassArray_Parameter[i])
         {
             case ModePass.ByValue:
                 IL.Emit(OpCodes.Ldarg, i);
                 break;
             case ModePass.ByRef:
                 IL.Emit(OpCodes.Ldarga, i);
                 break;
             default:
                 throw (new Exception(" 第 " + (i + 1).ToString() + " 个参数没有给定正确的传递方式 ."));
         }
     }
     if (IntPtr.Size == 4)
     {// 判断处理器类型
         IL.Emit(OpCodes.Ldc_I4, farProc.ToInt32());
     }
     else if (IntPtr.Size == 8)
     {
         IL.Emit(OpCodes.Ldc_I8, farProc.ToInt64());
     }
     else
     {
         throw new PlatformNotSupportedException();
     }
     IL.EmitCalli(OpCodes.Calli, CallingConvention.StdCall, Type_Return, TypeArray_ParameterType);
     IL.Emit(OpCodes.Ret); // 返回值
     MyModuleBuilder.CreateGlobalFunctions();
     // 取得方法信息
     MethodInfo MyMethodInfo = MyModuleBuilder.GetMethod("MyFun");
     return MyMethodInfo.Invoke(null, ObjArray_Parameter);// 调用方法,并返回其值
 }
Пример #7
0
        protected override void OnLoad(EventArgs e)
        {
            lrc_fun = new dld();
            lrc_fun.LoadDll("DrawLRC_DLL.dll");
            lrc_fun.LoadFun("InitGDI");

            object[]   Parameters     = new object[] { };
            Type[]     ParameterTypes = new Type[] { };
            ModePass[] themode        = new ModePass[] { };
            Type       Type_Return    = typeof(void);

            lrc_fun.Invoke(Parameters, ParameterTypes, themode, Type_Return);
            lrc_fun.LoadFun("CreateLRC");
            lrc_fun.Invoke(Parameters, ParameterTypes, themode, Type_Return);

            base.OnLoad(e);
        }
Пример #8
0
        private void cboLrcColor_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!iscboColor)
            {
                iscboColor = true;
                return;
            }
            String colorstr = cboLrcColor.Text;

            if (colorstr.Equals(""))
            {
                return;
            }
            int index = 1;

            if (colorstr.Equals("蓝色"))
            {
                index = 1;
            }
            else if (colorstr.Equals("绿色"))
            {
                index = 2;
            }
            else if (colorstr.Equals("红色"))
            {
                index = 3;
            }
            else if (colorstr.Equals("白色"))
            {
                index = 4;
            }
            else if (colorstr.Equals("黄色"))
            {
                index = 5;
            }
            object[]   Parameters     = new object[] { (int)index };
            Type[]     ParameterTypes = new Type[] { typeof(int) };
            ModePass[] themode        = new ModePass[] { ModePass.ByValue };
            Type       Type_Return    = typeof(void);

            lrc_fun.LoadFun("SetLRCColor");
            lrc_fun.Invoke(Parameters, ParameterTypes, themode, Type_Return);
        }
Пример #9
0
        /// <summary>
        /// DEC加密方法
        /// </summary>
        /// <param name="original"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string EncryptDec(string original, string key)
        {
            string str = string.Empty;

            try
            {
                lock (DecryptDld)
                {
                    if (!DecryptDld.BLoadDll)
                    {
                        string dllPath = string.Format(@"{0}dll\UrlParam.dll", AppDomain.CurrentDomain.SetupInformation.ApplicationBase);

                        DecryptDld.LoadDll(dllPath);
                    }
                    DecryptDld.LoadFun("UrlEncoding");

                    object[] parameters = new object[] { key, original };                       // 实参为0

                    Type[] parameterTypes = new Type[] { typeof(string), typeof(string) };      // 实参类型为int

                    ModePass[] themode = new ModePass[] { ModePass.ByValue, ModePass.ByValue }; // 传送方式为值传

                    Type typeReturn = typeof(IntPtr);                                           // 返回类型为int


                    IntPtr ret = (IntPtr)DecryptDld.Invoke(parameters, parameterTypes, themode, typeReturn);
                    str = Marshal.PtrToStringAnsi(ret);

                    //DecryptDLD.UnLoadDll();

                    Marshal.Release(ret);
                }
            }
            catch (Exception)
            {
                //  LogWriter.Write("PASS", err.Message);
            }

            return(str);
        }
Пример #10
0
        private void timeLrcTime_Tick(object sender, EventArgs e)
        {
            if (lrcanalysis != null)
            {
                //lblLrcText.Text=lrcanalysis.getLrcInfo(wmpPlay.currentMedia.
                //lblLrcText.Text = "ss:" + wmpPlay.currentMedia.duration.ToString();获取总时间秒
                //lblLrcText.Text=wmpPlay.Ctlcontrols.currentPosition.ToString();获取当前进度
                long    temp = 0;
                LrcInfo info = lrcanalysis.getLrcInfo((long)(wmpPlay.Ctlcontrols.currentPosition * 1000), out temp);
                if (info != null)
                {
                    lblLrcText.Text = info.Lrcstr;
                    lbl_trim.Text   = (temp / 1000).ToString();
                    if (!lrc_temp.Equals(info.Lrcstr))
                    {
                        lrc_temp = info.Lrcstr;
                        tmp_i    = 0;
                        //dll动态链接库歌词程序
                        byte[] tempStr = Encoding.Default.GetBytes(info.Lrcstr);
                        byte[] tempDef = Encoding.Convert(Encoding.Default, Encoding.Unicode, tempStr);
                        //String lrcstr = Encoding.Unicode.GetString(tempDef);

                        lrc_fun.LoadFun("DrawLRC_SHOW_TEXT");
                        object[]   Parameters     = new object[] { (byte[])tempDef };
                        Type[]     ParameterTypes = new Type[] { typeof(byte[]) };
                        ModePass[] themode        = new ModePass[] { ModePass.ByValue };
                        Type       Type_Return    = typeof(void);
                        lrc_fun.Invoke(Parameters, ParameterTypes, themode, Type_Return);
                        lrc_fun.LoadFun("SetDrawLRCTime");
                        Parameters     = new object[] { (long)(temp / 1000) };
                        ParameterTypes = new Type[] { typeof(long) };
                        themode        = new ModePass[] { ModePass.ByValue };
                        lrc_fun.Invoke(Parameters, ParameterTypes, themode, Type_Return);
                    }
                }
            }
        }
Пример #11
0
Файл: dld.cs Проект: viticm/pap2
        public object Invoke(string strFunctionName, object[] ObjArray_Parameter, Type[] TypeArray_ParameterType, ModePass[] ModePassArray_Parameter, Type Type_Return)
        {
            curFunName = strFunctionName;
            m_ObjArray_Parameter = ObjArray_Parameter;
            if (m_htFuns[strFunctionName] == null)
            {
                LoadFun(strFunctionName);
            }
            else
            {
                LoadFun(strFunctionName);
                MethodInfo minfo = (MethodInfo)m_htFuns[strFunctionName];
                return minfo.Invoke(null, ObjArray_Parameter);                
            }

            if (farProc == IntPtr.Zero)
                return null;
            else
            {
                return Invoke(farProc, ObjArray_Parameter, TypeArray_ParameterType, ModePassArray_Parameter, Type_Return);
            }
        }
Пример #12
0
Файл: dld.cs Проект: viticm/pap2
 /// <summary> 
 /// 调用所设定的函数 
 /// </summary> 
 /// <param name="IntPtr_Function"> 函数指针 </param> 
 /// <param name="ObjArray_Parameter"> 实参 </param> 
 /// <param name="TypeArray_ParameterType"> 实参类型 </param> 
 /// <param name="ModePassArray_Parameter"> 实参传送方式 </param> 
 /// <param name="Type_Return"> 返回类型 </param> 
 /// <returns> 返回所调用函数的 object</returns> 
 public object Invoke(IntPtr IntPtr_Function, object[] ObjArray_Parameter, Type[] TypeArray_ParameterType, ModePass[] ModePassArray_Parameter, Type Type_Return)
 {
     // 下面 2 个 if 是进行安全检查 , 若不能通过 , 则抛出异常 
     if (hModule == IntPtr.Zero)
         throw (new Exception(" 函数库模块的句柄为空 , 请确保已进行 LoadDll 操作 !"));
     if (IntPtr_Function == IntPtr.Zero)
         throw (new Exception(" 函数指针 IntPtr_Function 为空 !"));
     farProc = IntPtr_Function;
     return Invoke(ObjArray_Parameter, TypeArray_ParameterType, ModePassArray_Parameter, Type_Return);
 }
Пример #13
0
 /// <summary>
 /// �������趨�ĺ���
 /// </summary>
 /// <param name="IntPtr_Function"> ����ָ�� </param>
 /// <param name="ObjArray_Parameter"> ʵ�� </param>
 /// <param name="TypeArray_ParameterType"> ʵ������ </param>
 /// <param name="ModePassArray_Parameter"> ʵ�δ��ͷ�ʽ </param>
 /// <param name="Type_Return"> �������� </param>
 /// <returns> ���������ú����� object</returns>
 public object Invoke(IntPtr IntPtr_Function, object[] ObjArray_Parameter, Type[] TypeArray_ParameterType, ModePass[] ModePassArray_Parameter, Type Type_Return)
 {
     // ���� 2 �� if �ǽ��а�ȫ��� , �����ͨ�� , ���׳��쳣
     if (hModule == IntPtr.Zero)
         throw (new Exception(" ������ģ��ľ��Ϊ�� , ��ȷ���ѽ��� LoadDll ���� !"));
     if (IntPtr_Function == IntPtr.Zero)
         throw (new Exception(" ����ָ�� IntPtr_Function Ϊ�� !"));
     farProc = IntPtr_Function;
     return Invoke(ObjArray_Parameter, TypeArray_ParameterType, ModePassArray_Parameter, Type_Return);
 }
Пример #14
0
        /// <summary>
        /// 获得函数指针
        /// </summary>
        /// <param name="moduleHandle"> dll句柄 </param>
        /// <param name="lpProcName"> 调用函数的名称 </param>
        /// <param name="paramTypes"> 函数的传入参数类型列表 </param>
        /// <param name="returnType"> 函数的返回值类型 </param>
        public IntPtr LoadFun(IntPtr moduleHandle, string lpProcName, string[] paramTypes, string returnType)
        {
            // 若函数库模块的句柄为空,则抛出异常
            if (moduleHandle == IntPtr.Zero)
            {
                throw (new Exception("Dll is not mounted!"));
            }
            // 取得函数指针
            IntPtr functionHandle = GetProcAddress(moduleHandle, lpProcName);

            // 若函数指针,则抛出异常
            if (functionHandle == IntPtr.Zero)
            {
                throw (new Exception(" Do not found the function :" + lpProcName));
            }
            _modules[moduleHandle].Add(functionHandle);

            Type[]     ts             = new Type[paramTypes == null ? 0 : paramTypes.Length];
            ModePass[] paramPassTypes = new ModePass[ts.Length];
            for (int i = 0; i < ts.Length; i++)
            {
                ts[i]             = StringToType(paramTypes[i]);
                paramPassTypes[i] = ModePass.ByValue;
            }
            Type tyre = StringToType(returnType);

            // 下面是创建 MyAssemblyName 对象并设置其 Name 属性
            AssemblyName myAssemblyName = new AssemblyName();

            myAssemblyName.Name = "InvokeFun";
            // 生成单模块配件
            AssemblyBuilder myAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
            ModuleBuilder   myModuleBuilder   = myAssemblyBuilder.DefineDynamicModule("InvokeDll");
            // 定义要调用的方法 , 方法名为“ MyFun ”,返回类型是“ Type_Return ”参数类型是“ TypeArray_ParameterType ”
            MethodBuilder myMethodBuilder = myModuleBuilder.DefineGlobalMethod("MyFun", MethodAttributes.Public | MethodAttributes.Static, tyre, ts);
            // 获取一个 ILGenerator ,用于发送所需的 IL
            ILGenerator il = myMethodBuilder.GetILGenerator();

            for (int i = 0; i < ts.Length; i++)
            {// 用循环将参数依次压入堆栈
                switch (paramPassTypes[i])
                {
                case ModePass.ByValue:
                    il.Emit(OpCodes.Ldarg, i);
                    break;

                case ModePass.ByRef:
                    il.Emit(OpCodes.Ldarga, i);
                    break;

                default:
                    throw (new Exception(" parameter[" + (i + 1) + "]'s format is not valid! ."));
                }
            }
            if (IntPtr.Size == 4)
            {// 判断处理器类型
                il.Emit(OpCodes.Ldc_I4, functionHandle.ToInt32());
            }
            else if (IntPtr.Size == 8)
            {
                il.Emit(OpCodes.Ldc_I8, functionHandle.ToInt64());
            }
            else
            {
                throw new PlatformNotSupportedException();
            }
            il.EmitCalli(OpCodes.Calli, CallingConvention.StdCall, tyre, ts);
            il.Emit(OpCodes.Ret); // 返回值
            myModuleBuilder.CreateGlobalFunctions();
            // 取得方法信息
            _methods[functionHandle] = myModuleBuilder.GetMethod("MyFun");
            return(functionHandle);
        }