95992828九五至尊2

Winform开发框架之权能管理种类,详细实例

二月 26th, 2019  |  882828九五至尊手机版

本作品转发:http://www.cnblogs.com/wuhuacong/archive/2011/05/08/2040620.html

C#能够一贯引用C++的DLL和转换JAVA写好的先后。近来是因为工作缘故接触那方面相比较多,根据实际供给,我们经过一个现实事例把几个JAVA方法转换来能够由C#直白调用的DLL

  

C#调用c++

C#调用C++的例子网上海人民广播电台湾大学,以二个C++的具体方法为例。

至此,权限管理模块介绍已经告竣,上面给出贰个调用例子德姆o程序给大家参考学习,下载地址如下:

C++代码

// 获取一帧图像数据
MVSMARTCAMCTRL_API int __stdcall MV_SC_GetOneFrame(IN void* handle, 
                                                  IN OUT unsigned char *pData , 
                                                  IN unsigned int nDataSize, 
                                                  IN OUT MV_SC_IMAGE_OUT_INFO* pstImageInfo);
// 结果数据缓存的上限
#define MV_SC_MAX_RESULT_SIZE       (1024*16)

// 输出帧的信息
typedef struct _MV_SC_IMAGE_OUT_INFO_
{
    unsigned short      nWidth;             // 图像宽
    unsigned short      nHeight;            // 图像高
    unsigned int        nFrameNum;          // 帧号
    unsigned int        nFrameLen;          // 当前帧数据大小
    unsigned int        nTimeStampHigh;     // 时间戳高32位
    unsigned int        nTimeStampLow;      // 时间戳低32位
    unsigned int        nResultType;           // 输出的消息类型
    // 根据消息类型对应不同的结构体
    unsigned char       chResult[MV_SC_MAX_RESULT_SIZE];
    unsigned int        nReserved[8];       // 保留
}MV_SC_IMAGE_OUT_INFO                                                  

http://files.cnblogs.com/wuhuacong/SecurityDemo.rar 

C#代码

    /// <summary>
    /// 获得相机所拍照片
    /// </summary>
    /// <param name="handle"></param>
    /// <returns></returns>
    [DllImport("MvSmartCamCtrl.dll")]
    public static extern int MV_SC_GetOneFrame(IntPtr handle, Byte[] pData, int nDataSize, out MV_SC_IMAGE_OUT_INFO pstDevInfo);

        // 输出帧的信息
    [StructLayout(LayoutKind.Sequential)]
    public struct MV_SC_IMAGE_OUT_INFO
    {
        public short nWidth;             // 图像宽
        public short nHeight;            // 图像高
        public int nFrameNum;          // 帧号
        public int nFrameLen;          // 当前帧数据大小
        public int nTimeStampHigh;     // 时间戳高32位
        public int nTimeStampLow;      // 时间戳低32位
        public int nResultType;           // 输出的消息类型
        // 根据消息类型对应不同的结构体
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024 * 16)]
        public MV_SC_RESULT_BCR chResult;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public int[] nReserved;
    }

这么大家把那些DLL放在程序根目录下,就能达成DLL方法的调用。

 

C#调用JAVA方法

IKVM.NET是三个对准Mono和微软.net框架的java达成,其设计指标是在.NET平台上运转java程序。它涵盖了以下的零部件:用.NET达成的java虚拟机,java类库的.NET完毕。
致力于在java和.NET之间相互的工具。

前一篇文书的字典组件模块调用例子德姆o程序下载地址也一并提供下载,下载地址如下:

程序要求

我们有三个JAVA写好的德姆o,传的参数是用Gzip举办削减传到服务器的,代码如下:

package Demo;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpClientParams;
import com.google.gson.Gson;

public class Demo
{

    public static String doPostClient(String json, String url)
    {
        HttpClient httpClient = new HttpClient();
        String rval = "";
        PostMethod postMethod = new PostMethod(url);
        try
        {
            Gson gson = new Gson();
            InputStream in = new ByteArrayInputStream(objectToByte(json));
            postMethod.setRequestBody(in);
            HttpClientParams params = new HttpClientParams();
            httpClient.setParams(params);
            httpClient.executeMethod(postMethod);
            byte[] b = postMethod.getResponseBody();
            String rtnData = (String) byteToObject(b);
            rval = gson.toJson(rtnData);
        } catch (Exception e)
        {
            rval="erro:"+e.getMessage();
        } finally
        {
            postMethod.releaseConnection();
        }
        return rval;
    }

    public static byte[] objectToByte(java.lang.Object obj)
    {
        byte[] bytes = null;
        ObjectOutputStream oo = null;
        try
        {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            GZIPOutputStream gzip = new GZIPOutputStream(out);
            gzip.write(obj.toString().getBytes("utf-8"));
            gzip.close();
            bytes = out.toByteArray();

        } catch (Exception e)
        {
            e.printStackTrace();
        } finally
        {
            if (oo != null)
            {
                try
                {
                    oo.close();
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return bytes;
    }

    private static java.lang.Object byteToObject(byte[] bytes)
    {
        String obj = "";
        ObjectInputStream oi = null;
        try
        {
            ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
            GZIPInputStream gzipi = new GZIPInputStream(bi);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gzipi, "UTF-8"));
            String line;
            while ((line = bufferedReader.readLine()) != null)
            {
                obj+=line;              
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        } finally
        {
            if (oi != null)
            {
                try
                {
                    oi.close();
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return obj;
    }

}

本条代码笔者用C#改写了,用HttpWebRequest的艺术传到服务器,服务器那边Gzip解压不住,查了缘由是因为Java与C#的Byte类型值范围不一,咱们有二种缓解思路,一种是将那几个JAVA做成webservice挂在服务器上,c#再去调用,第二种正是将这几个主意编写翻译成可由C#直接调用的DLL,由于那么些方法效果相比单纯,大家选拔了后世。

http://files.cnblogs.com/wuhuacong/DictionaryDemo.rar

条件布署

882828九五至尊手机版,IKVM.NET 下载后解压获得BIN文件夹中的数据,用于JACRUISER包转换和基础DLL。
IKVM.OpenJDK.ClassLibrary.dll用于C#程序连接。
下载地址:https://yunpan.cn/cBHTS5fXsIe9v 访问密码 0847。
将IKVM.NET的BIN文件夹的地方添加到环境变量。
电脑右键属性–高级系统安装–高级–环境变量–在系统变量中找到PATH–将BIN文件夹的地方添加进去,
在CMD中输入ikvmc 有赞助文书档案表达环境布署成功。
Bin文件夹下的IKVM.OpenJDK.Core.dll,IKVM.Runtime.dll,IKVM.Runtime.JNI.dll和IKVM.OpenJDK.ClassLibrary.dll为公共DLL,全体转换程序都需引用

转换步骤

1.规定引用关系:
该德姆o的组织如下:
882828九五至尊手机版 1

Demo.jar 依赖于 commons-httpclient-3.1.jar 和 gson-2.4.jar
commons-httpclient-3.1.jar 依赖于 commons-logging-1.1.3.jar 和
commons-codec-1.6.jar

大家先将gson-2.4.jar,commons-logging-1.1.3.jar,commons-codec-1.6.jar
生成DLL,语法如下:

ikvmc JATiggo包物理路径。
win7系统暗许生成在C:\Users\Administrator 这么些文件夹下

commons-httpclient-3.1.dll 生成语法如下:

ikvmc commons-httpclient-3.1.jar -r:commons-logging-1.1.3.dll
-r:commons-codec-1.6.dll

小编们将德姆o打包的名字为JavaApi.德姆o 这样生成的 JavaApi.dll 生成语法如下:

ikvmc JavaApi.Demo.jar -r:commons-httpclient-3.1.dll -r:gson-2.4.dll

地点的公文都是相对应的大体路径,然后将全体变化的DLL添加到C#项目中援引,包涵从前的公共DLL,引用到品种中具有引用的DLL如图:
882828九五至尊手机版 2

这么就足以直接在程序中使用这几个java方法了
Demo.Demo.doPostClient(js, url);
先是个Demo java程序中的package名。
其次个德姆o java程序中的class名。

40楼的褒贬:

不过可以先帖上权限的核心控制部分的代码:

/// <summary> 
/// 设置form上的组件的权限 
/// </summary> 
/// <param name="form">控件所在的窗体</param> 
/// <param name="getPermissionsHandler">取得form里组件名及其Enabled属性(当前用户)的键值对</param> 
public static void SetPermissions(this Form form, Func<Form, IDictionary<string, bool>> getPermissionsHandler) 
{ 
    Type t = form.GetType(); 
    FieldInfo[] fs = t.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); 
    IDictionary<string, bool> permissions = getPermissionsHandler(form); 
    foreach (FieldInfo f in fs) 
    { 
        dynamic component = f.GetValue(form); 
        if (component is System.ComponentModel.Component && permissions.ContainsKey(f.Name)) 
        { 
            try
            { 
                component.Enabled = permissions[f.Name]; 
            } 
            catch { } 
        } 
    } 
} 

 

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图