使用aardio + .NET 快速开发独立 EXE 程序,可防 ILSpy 反编译

使用aardio + .NET 快速开发独立 EXE 程序,可防 ILSpy 反编译

aardio简介

aardio 可以非常方便地调用 .NET( 不需要任何复杂的步骤 )。

.NET 在 aardio 中很好用,系统自带 .NET 组件以及各种开源 .NET 组件在 aardio 用户中也很受欢迎。

aardio + .NET 生成的 EXE —— 可避免被 ILSpy 直接反编译。

aardio 调用 .NET 示例:

//导入 .NET 支持库
import dotNet;
 
//导入.NET 程序集
dotNet.import("System"); 

//调用类的静态成员函数
var isValidHost = System.Uri.CheckHostName("www.aardio.com"); 

//构造 .NET 对象
var uri = System.Uri("https://www.aardio.com/test?q=aardio");

//读或写 .Net 对象的实例属性
var host = uri.Host;

//调用 .Net 对象实例的成员函数
var hash = uri.GetHashCode();


aardio 语法与 JavaScript 接近。

aardio + .Net 开发对 .NET 版本没有严格要求 —— 兼容流行 Windows 系统自带的不同版本 .NET。不但可以调用系统自带的大量 .NET 组件,也可以生成体积很小的 EXE 文件。

Win7 自带 .Net 3.5.1,支持 lambda

Win8 自带 .Net 3.5.1 + .Net 4.5

Win10 自带 .Net 4.6

Win10 1709 自带 .Net 4.7.1 ,支持 ValueTuple

Win11 自带 .NET 4.8

内存加载 .NET 程序集,生成独立 EXE
aardio 提供 dotNet.reference() 函数 —— 可以方便地通过内存数据加载 .NET 程序集,这样就可以生成独立 EXE 程序,不再需要带上一堆 DLL 文件。

将内存数据绑定为 .NET 程序集示例:

import dotNet;

dotNet.reference({
  ["test.mydll"] = $"\test.mydll.dll";
  ["test.core"] = $"\test.core.dll"; 
});


dotNet.reference() 的第 1 个参数指定程序集名称,第 2 个参数指定实际要加载的程序集路径或内存数据,aardio 代码在文件路径前加 $ 号可将文件数据编译为二进制字符串( 发布后不再需要原文件 )。

然后就可以正常导入内存程序集了,代码如下:

dotNet.import("test.mydll");


上面的代码导入 .NET 程序集,然后再将 .NET 名字空间导入 aardio ,dotNet.import() 函数的作用与下面的代码相同:

//导入 .NET 程序集
var assembly = dotNet.load("test.mydll"); 

//导入 .NET 名字空间
assembly.import("test.mydll");


aardio 标准库提供的 .NET 库
aardio 标准库中已经提供了一些 .NET 库,例如 System ,调用示例:

//导入 .NET 名空间
import System; 

//用 System 名字空间下面的类构造对象实例
var uri = System.Uri("https://www.aardio.com/test?q=aardio")

//读或写 .Net 对象的实例属性
var host = uri.Host ;


aardio 代码一般使用小驼峰命名风格,但 .NET 名字空间或类名一般会大写首字母以示区别。

我们右键点 System ,在弹出菜单内点击「跳转到定义」看一下 System 库的源代码。

800_auto

可以看到这个 Sytem 库的关键代码只有两句:

import dotNet;
dotNet.import("System")


嵌入 .NET 窗口控件到 aardio 窗口
aardio 窗口嵌入 .NET DataGridView 控件范例的运行效果:


首先要了解 .Net 的所有控件都应当放在 .Net 创建的窗口里(也就是 System.Windows.Forms.Form 对象),窗口是管理控件的容器,不能直接把控件单独拧出来往 aardio 窗口里扔。

如果不想去弄个窗口,aardio 提供了一个更简单的方法 ,例如把 .Net 的 DataGridView 控件直接嵌入 aardio 窗口:

import System.Windows.Forms;

var Forms = System.Windows.Forms;
var dataGridView = Forms.CreateEmbed("DataGridView",winform.custom);


非常简单。

好了,现在创建 DataTable 数据表,准备把他显示到控件里,先创建数据列,重点看怎么指定列字段使用的数据类型:

//添加数据列
var dataTable = System.Data.DataTable("DT");
dataTable.Columns.Add("名称");//添加列
dataTable.Columns.Add("计数",System.Type.GetType("System.Double")); //添加指定数据类型的列
dataTable.Columns.Add("选择",System.Type.GetType("System.Boolean")); //自动显示复选框


然后绑定数据源到视图:
//绑定数据源到视图
var dataView = System.Data.DataView(dataTable);
dataGridView.DataSource = dataView;
dataGridView.EditMode=2;


好吧,想再加一个下拉框吗?!这个就略有些麻烦了,代码如下:
//先移除自动生成的列
dataGridView.Columns.Remove("名称");

//下面添加下拉框以替换上面移除的列
var cmbColumn = Forms.DataGridViewComboBoxColumn();
cmbColumn.Width = 120;
cmbColumn.Name = "Name";
cmbColumn.DataPropertyName = "名称";//对应上面 dataTable 里的字段名
cmbColumn.HeaderText = "名称"; //显示在列标题里的文本

//如果名称与显示值一样,那直接给 cmbColumn.DataSource 赋值一个数组就可以
//下面绑定下拉候选框的数据源,上面的 DataPropertyName 才是真正要读写的数据值。
cmbColumn.DisplayMember = "Name";//下拉框显示文本的属性名
cmbColumn.ValueMember = "Value"; //下拉框选项值的属性名
cmbColumn.DataSource = dotNet.createNameValueList(
{ "王五","张三"},
{ "WangWu","ZhangSan"}
);

//添加这个新的下拉框到数据视图
dataGridView.Columns.Add(cmbColumn);

//移动到第一列
dataGridView.Columns.Item["Name"].DisplayIndex = 0;
然后添加下面的代码响应 .NET 控件的事件:

//添加事件(event)
dataTable.ColumnChanged = function(sender,eventArgs){
var columnName = eventArgs.Column.ColumnName;
var value = eventArgs.Row.getItem(columnName);
winform.edit.print("已改变列:",columnName," 已变更值:",value);
}


然后读写数据:

//添加测试数据
var row = dataTable.NewRow();
row.ItemArray = {"WangWu",123, true}
dataTable.Rows.Add(row);

//读取数据
winform.button.oncommand = function(id,event){

for(i=1;dataTable.Rows.Count;1){
var arr = dataTable.Rows[i].ItemArray;
winform.edit.print( arr[1] ) ;
}
}


以上完整范例源代码请参考 aardio 自带范例:

aardio 范例 / 调用其他语言 / .Net / 控件窗口 / 嵌入控件

可以看到 aardio 自带了大量调用 .NET 的范例。

在 aardio 中加载的 .NET 程序集如何调试
用下面的代码在 aardio 中加载 .NET 程序集的 pdb 调试文件:

dotNet.loadFile( "程序集路径" ,"pdb 调试文件路径" );
然后用 VS 附加运行的 aardio 进程就可以调试了,懂 .NET 的都懂,这个不多说了。

用 aardio 在运行时编译 C# 源码
直接看 aardio 代码示例:

import dotNet;

//创建 C# 语言编译器
var compiler = dotNet.createCompiler("C#");

//DLL 程序集要提前引入,System.dll 默认已引入,注意这函数不支持内存 DLL
compiler.Reference("System.dll");

//设置待编译C#源码( 注释可赋值为字符串,注释标记首尾星号数目要一致 )
compiler.Source = /***
?>
/*如果 C# 代码开始于 aardio 模板标记,则启用 aardio 模板语法。
*/

namespace CSharpLibrary
{
public class Object
{
<?...

点击查看剩余70%

{{collectdata}}

网友评论