1、事件作为参数传递

public class Para
{
// 定义一种委托(事件类型),可以在此定义这个事件的返回值和参数
public delegate object GetDataMethodAction();
// 使用这个事件类型接收参数
public GetDataMethodAction GetDataMethod { get; set; }
} public void Main()
{
// 构建事件参数
Para para = new Para(){
GetDataMethod = () => { return new InvStorageManager().selectForApp().data; }
};
// 传入参数
test(para);
} public void test(Para para)
{
// 调用传入的事件
var result = para.GetDataMethod.Invoke();
}

2、反射

//一、从程序集反射所有类
Type[] typeArr = Assembly.LoadFrom("Ciphis.BusinessLogic.dll").GetTypes();//程序集
foreach (Type t in typeArr)
{
if (t.ToString() == "Ciphis.HelperClasses.SalesOrderFields")//命名控件+类名
{ }
} //二、获取某个类的属性值和属性名称
//获取所有属性
System.Reflection.PropertyInfo[] properties = t.GetProperties();
foreach (System.Reflection.PropertyInfo property in properties)
{
string name = property.Name;
object value = property.GetValue(null,null);//第一个参数可以传入某个实体?如果获取静态类的值好像可以传入null
}

3、类库的开放性,针对某些程序集开放某些类、方法

可以设置类A为Internal
然后在该类库的AssemblyInfo.cs中
写[assembly:InternalsVisibleTo("UnitTest")],对某个类库开放 创建签名
、打开VS命令提示行
开始 -- 程序 -- Microsoft Visual Studio -- Visual Studio Tools --Visual Studio 命令提示
、输入sn -k c:\test.snk
、输入sn -p c:\test.snk c:\publicKey.snk 生成公钥
、输入sn -tp c:\publicKey.snk 显示公钥 在加密类库写
[assembly: InternalsVisibleTo("LTMain,PublicKey=002400000480000094000000060200000024000052534131000400000100010097b16f9cfea93610a1726634cb6427e185590dbc752aec69025c28fd9638f8c078126414bf9d112324f7132f960262785bf77525f92522cb7db726c2c087b19ec7623169b8958babaff76959d186311fbc20764a2eb2a0cbd187c7f53452b05007f8d1c941830c4dc73e80d2ecf32bdb6f0a78d07f79bbbc2afc10117e5714ba")]
然后把test.snk复制到LTMain项目中,在LTMain项目属性中设置签名为text.snk
这样LTMain就可以引用加密类库中的Internal类 如果出现错误,全部类库都加上这个签名肯定没错的 http://www.west.cn/www/info/60919-1.htm
大家做项目开发一般都是分层的,比如UI层,业务层,数据访问层。业务层引用数据访问层的DLL(比如dataAccess.dll),并使用dataAccess.dll中的方法。当项目完成并给客户用了,可有些心里BT的客户这个时候也可以请个稍微懂NET的人来引用你的dataAccess.dll并调用其中的方法搞破坏。比如可以直接使用里面的ChangePwd(string UserName,string Pwd)方法把其他用户的密码改了,这个时候就你就.......
好了,该开始说怎么保护我们的代码了:
首先我们需要把我们的程序集做成强命名的程序集。
这里我们在.NET 命令提示中输入sn -k c:\test.snk 创建一个新的随机密钥对并将其存储在 c:\test.snk 中
然后新建立类库ClassLibrary1,里面只有个类文件Class1.cs,代码如下:
using System; namespace ClassLibrary1
{
public class Class1
{
public Class1()
{
//
// TODO: 在此处添加构造函数逻辑
//
} public string Insert()
{
return "ok";
}
}
} AssemblyInfo.cs代码:
//............其他的就用默认
[assembly: AssemblyKeyFile("c:\\test.snk")] // 连接上面用强命名工具SN.exe生成的文件. 接着创建个WindowApplication来调用我们的ClassLibrary1,代码:
private void button1_Click(object sender, System.EventArgs e)
{
MessageBox.Show(new ClassLibrary1.Class1().Insert());
}
不修改WindowApplication的AssemblyInfo.cs。
在这里就可以直接运行了,不过大家都看的出来,这样是能成功调用Class1中的方法的。 现在让我们来修改下Class1.cs,代码:
using System;
using System.Security.Permissions;
namespace ClassLibrary1
{
[StrongNameIdentityPermissionAttribute(SecurityAction.LinkDemand, PublicKey =
"00240000048000009400000006020000002400005253413100040000010001000551684edd1600"+
"8ccbdd337b1cf1490490d97fe0048c5f3629cc4f5104578499eace9b2a94115022edd620def472"+
"8b4f088291cfa77a40659afba611fdafbb7894b93a64049d439936bd0cd8dc0704625aeb735892"+
"e9eb3f910a49a2925af10515d935654d7adac5567ff6d780d23d587de0ff4d271da7b30680fa88"+
"a47a4ba4")]
public class Class1
{
public Class1()
{
//
// TODO: 在此处添加构造函数逻辑
//
} public string Insert()
{
return "ok";
}
}
} 然后再编译后运行windowapplication调用class1中的方法就会出错。
这里的StrongNameIdentityPermissionAttribute是NET提供的CAS(Code Access Security)中的1个类,具体可参考MSDN,SecurityAction.LinkDemand 是要求直接调用方已被授予了指定的权限,这里即windowapplication要授予了权限才行,如果使用SecurityAction.Demand要求调用堆栈中的所有高级调用方都已被授予了当前权限对象所指定的权限。他们的区别是:如果windowapplication已授权访问,而还有个windowapplication2(未授权访问)通过调用windowapplication中的button1_Click方法来调用class1,这个时候如果使用SecurityAction.LinkDemand就能成功调用,而使用SecurityAction.Demand windowapplication2就不能调用,windowapplication 在这2种情况下都能调用。
说到这里大家一定再问PublicKey=后面一串那么长的字符串怎么来。PublicKey后面的字符串是你开始生成的c:\test.snk文件中保存的公钥。那怎么才能看到这个公钥了,照样是用SN.EXE。
输入sn -p c:\test.snk c:\publicKey.snk (从 test.snk 中提取公钥并将其存储在 publicKey.snk 中)
再输入sn -tp c:\publicKey.snk (显示公钥信息)
上面这个命令就能看到PublicKey后面的字符串了,还想什么啊,把那字符串copy下来啊。
最后大家一定在关心这个时候windowapplication 要怎么调用class1了,其实也简单,只要把windowapplication 的AssemblyInfo.cs修改为:
[assembly: AssemblyKeyFile("c:\\test.snk")]
到这里就一切OK了,大家都看到最关键的就是test.snk文件了,所以一定要保护好你自己的test.snk文件。
下面是我的代码,大家可以下载看看,在使用的时候记的要把我KEY文件夹下的test.snk copy到c盘。
不然会出错^_^。
http://www.cnblogs.com/Files/BearsTaR/Solution1.rar

4、程序内存超过1.2G报错退出

因为软件设置了X86平台,应该改成anyCPU

【c#技术】一篇文章搞掂:常见C#技术问题的更多相关文章

  1. 【已转移】【Java架构:基础技术】一篇文章搞掂:Spring

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文是对<SPRING实战第4版>的总结,大家也可以去仔细研读该书 [------------------------ ...

  2. 【进阶技术】一篇文章搞掂:Spring Cloud Stream

    本文总结自官方文档http://cloud.spring.io/spring-cloud-static/spring-cloud-stream/2.1.0.RC3/single/spring-clou ...

  3. 【已转移】【Java架构:基础技术】一篇文章搞掂:Java 8

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 一.Java的历史与演变 目的:为完全了解Java,需要理解Java的诞生原因.成型动力以及他继承的思想. 计算机语言的创新与发展 ...

  4. 【Java架构:进阶技术】——一篇文章搞掂:JVM调优

    Sun官方定义的Java技术体系: Java程序设计语言 各种硬件平台上的Java虚拟机 Class文件格式 Java API类库 来自商业机构和开源社区的第三方Java类库 JDK(Java Dev ...

  5. 【进阶技术】一篇文章搞掂:OAuth2

    一.第一步 1.什么是OAuth2,为什么应该了解 应用程序请求资源所有者进行认证,并接受tokens来访问这些资源应用程序不是以控制资源的“人”的角度去访问资源,而是用许可证举例,备用钥匙,车主主钥 ...

  6. 【Java架构:基础技术】一篇文章搞掂:Spring Boot 官方文档解读

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文内容大部分是翻译和总结官方文档,可以到https://docs.spring.io/spring-boot/docs查看(此地 ...

  7. 【Java架构:基础技术】一篇文章搞掂:Spring Boot

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文是对<Spring Boot 实战第4版>的总结,大家也可以去仔细研读该书 注意,书中使用的Spring Boot ...

  8. 【进阶技术】一篇文章搞掂:Spring高级编程

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文基于<Spring5高级编程>一书进行总结和扩展,大家也可以自行研读此书. 十一.任务调度 任务调度主要由三部分组 ...

  9. 【Java架构:基础技术】一篇文章搞掂:MyBatis

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文主要总结于刘增辉的<MyBatisc从入门到精通>一书,有兴趣的朋友可以自行研读 建议仔细研读官方文档: http ...

随机推荐

  1. chromedriver与chrome版本映射表(更新至v2.46)

    chromedriver版本 支持的Chrome版本 v2.46 v71-73 v2.45 v70-72 v2.44 v69-71 v2.43 v69-71 v2.42 v68-70 v2.41 v6 ...

  2. ceph-cluster map

    知道cluster topology,是因为这5种cluster map. ====================================== 知道cluster topology,是因为这 ...

  3. leetcode-解题记录 1108. IP 地址无效化

    题目: 给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". ...

  4. MySQL查询上一条记录和下一条记录

    如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from tab ...

  5. delphi vlc 安装bug 处理编译错误"0" is an invalid value for the "DebugInformation" parameter of the "DCC"

    处理编译错误"0" is an invalid value for the "DebugInformation" parameter of the "DCC" [摘要:http://blog.csdn ...

  6. Javascript对checkbox勾选判断,错误提示和按钮变色操作

    同意相关条款未打钩时,登录按钮为灰色且无法提交,点击灰色的登录按钮提示同意相关条款,打钩后变成亮色且可以提交信息. 勾选框及文字: <div class="check-rule&quo ...

  7. QTP Code Segment

    Dim WshShellset WshShell = CreateObject("WScript.Shell")WshShell.SendKeys "{DOWN}&quo ...

  8. UVA1629_Cake slicing

    Cake slicing 给你一个矩形大小,和每个樱桃的坐标,现在让你去切使得切之后的小矩形包含一个樱桃,每次切的代价是切痕的长度,问你最小代价是多少 思路: 首先要明白一点,不能切除一个不含樱桃的矩 ...

  9. Cocos2d-x之数据的处理

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. FileUtils 在游戏中,用户要保存自己的偏好设置和玩家的信息,都需要涉及到游戏数据的处理.首先要想处理数据,则要找到文件,创建文件, ...

  10. MySQL Workbench无法显示左侧的navigator,只显示Object info和Session

    问题描述:Mac版MySQL Workbench出现异常强制退出后,再次进入后左侧的navigator消失,左侧整个导航条消失了,只显示Object info和Session. 问题根源:MySQL ...