Board logo

标题: [问题求助] 求精通C#和PowerShell的大佬合并C#文件到PS中使用 [打印本页]

作者: 小白龙    时间: 2023-4-7 21:38     标题: 求精通C#和PowerShell的大佬合并C#文件到PS中使用

说来真是折腾,
先是找的AHK的代码高亮组件, 对中文支持不好,
接着找的C++代码, 遇到各种语法问题,
今天在github搜的时候, 找到一个.net组件名字叫EasyScintilla 编译成了exe用了一下, 居然支持8种编程语言语法着色, 完全满足需要, 更重要的时候, 我看了下源代码,  实际代码只要不到七八十行,
重要代码分布在了如下的 Form1.cs和Form1.Designer.cs两个文件中, 怎样把这两个文件合并后, 嵌入到ps中来运行呢? 求路过高手支招, 谢谢
编译后的EXE和源代码在下面链接
https://t.wss.ink/f/awy92us406a 复制链接到浏览器打开
效果展示
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using EasyScintilla.Stylers;
  11. namespace ExampleProject
  12. {
  13.     public partial class Form1 : Form
  14.     {
  15.         private ExampleDisplay[] _examples = new ExampleDisplay[]
  16.         {
  17.             new ExampleDisplay("C#", "cs.txt", new CSharpStyler()),
  18.             new ExampleDisplay("C# (Dark)", "cs.txt", new DarkCSharpStyler()),
  19.             new ExampleDisplay("Windows Batch", "bat.txt", new BatchStyler()),
  20.             new ExampleDisplay("HTML", "html.txt", new HtmlStyler()),
  21.             new ExampleDisplay("JSON", "json.txt", new JsonStyler()),
  22.             new ExampleDisplay("PowerShell", "ps1.txt", new PowerShellStyler()),
  23.             new ExampleDisplay("Python", "py.txt", new PythonStyler()),
  24.             new ExampleDisplay("Ruby", "rb.txt", new RubyStyler()),
  25.             new ExampleDisplay("T-SQL", "sql.txt", new SqlStyler()),
  26.             new ExampleDisplay("Teradata Parallel Transporter", "tpt.txt", new TptStyler()),
  27.         };
  28.         public Form1()
  29.         {
  30.             InitializeComponent();
  31.         }
  32.         private void Form1_Load(object sender, EventArgs e)
  33.         {
  34.             stylerPicker.DataSource = _examples;
  35.             stylerPicker.DisplayMember = "Display";
  36.         }
  37.         private void stylerPicker_SelectedIndexChanged(object sender, EventArgs e)
  38.         {
  39.             var example = _examples[stylerPicker.SelectedIndex];
  40.             editor.Text = example.ReadFile();
  41.             editor.Styler = example.Styler;
  42.         }
  43.     }
  44. }
复制代码
  1. namespace ExampleProject
  2. {
  3.     partial class Form1
  4.     {
  5.         /// <summary>
  6.         /// Required designer variable.
  7.         /// </summary>
  8.         private System.ComponentModel.IContainer components = null;
  9.         /// <summary>
  10.         /// Clean up any resources being used.
  11.         /// </summary>
  12.         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  13.         protected override void Dispose(bool disposing)
  14.         {
  15.             if (disposing && (components != null))
  16.             {
  17.                 components.Dispose();
  18.             }
  19.             base.Dispose(disposing);
  20.         }
  21.         #region Windows Form Designer generated code
  22.         /// <summary>
  23.         /// Required method for Designer support - do not modify
  24.         /// the contents of this method with the code editor.
  25.         /// </summary>
  26.         private void InitializeComponent()
  27.         {
  28.             this.editor = new EasyScintilla.SimpleEditor();
  29.             this.stylerPicker = new System.Windows.Forms.ComboBox();
  30.             this.SuspendLayout();
  31.             //
  32.             // editor
  33.             //
  34.             this.editor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
  35.             | System.Windows.Forms.AnchorStyles.Left)
  36.             | System.Windows.Forms.AnchorStyles.Right)));
  37.             this.editor.IndentationGuides = ScintillaNET.IndentView.LookBoth;
  38.             this.editor.Location = new System.Drawing.Point(12, 12);
  39.             this.editor.Name = "editor";
  40.             this.editor.Size = new System.Drawing.Size(854, 603);
  41.             this.editor.Styler = null;
  42.             this.editor.TabIndex = 0;
  43.             //
  44.             // stylerPicker
  45.             //
  46.             this.stylerPicker.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
  47.             | System.Windows.Forms.AnchorStyles.Right)));
  48.             this.stylerPicker.FormattingEnabled = true;
  49.             this.stylerPicker.Location = new System.Drawing.Point(12, 621);
  50.             this.stylerPicker.Name = "stylerPicker";
  51.             this.stylerPicker.Size = new System.Drawing.Size(854, 21);
  52.             this.stylerPicker.TabIndex = 1;
  53.             this.stylerPicker.SelectedIndexChanged += new System.EventHandler(this.stylerPicker_SelectedIndexChanged);
  54.             //
  55.             // Form1
  56.             //
  57.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  58.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  59.             this.ClientSize = new System.Drawing.Size(878, 656);
  60.             this.Controls.Add(this.stylerPicker);
  61.             this.Controls.Add(this.editor);
  62.             this.Name = "Form1";
  63.             this.Text = "EasyScintilla Test App";
  64.             this.Load += new System.EventHandler(this.Form1_Load);
  65.             this.ResumeLayout(false);
  66.         }
  67.         #endregion
  68.         private EasyScintilla.SimpleEditor editor;
  69.         private System.Windows.Forms.ComboBox stylerPicker;
  70.     }
  71. }
复制代码

作者: 小白龙    时间: 2023-4-7 21:53

本帖最后由 小白龙 于 2023-4-7 22:07 编辑

我的想法是, 把上面的代码编辑器定义为一个函数, 关闭编辑器后, 返回修改后的代码! 基本代码如下:


需要引用的dll文件EasyScintilla.dll 在EXE文件夹中
  1. Add-Type -Path "$home\Desktop\EasyScintilla.dll"
  2. $batcode=@'
  3. @echo off
  4. set p=c:
  5. for /f "tokens=*" %%i in ('wmic logicaldisk where "name='%p%'" get DriveType^,Description^,name  /value') do (
  6.      for /f "tokens=*" %%j in ("%%i") do set %%j
  7. )
  8. echo %name%  %Description%
  9. pause
  10. '@
  11. $pscode=@'
  12. $st = Get-Date   #脚本开头
  13. Get-Process
  14. $et = Get-Date   #脚本结尾
  15. ($et - $st).TotalSeconds   #计算
  16. '@
  17. # Todo: 函数 EasySci代码
  18. # 使用函数EasySci
  19. easysci -code $batcode
  20. easysci -code $pscode
复制代码

作者: jyswjjgdwtdtj    时间: 2023-4-7 22:39

没搞懂你要干什么(当然我没那能力帮你)
作者: Five66    时间: 2023-4-8 06:23

不懂winform,简单弄了下,机器太旧测试不了,不知道行不行,你自己试试看吧,出现找不到类型之类的自己尝试添加下winform或drawing或ScintillaNET.dll
  1. Add-Type -Path "$home\Desktop\EasyScintilla.dll"
  2. $batcode=@'
  3. @echo off
  4. set p=c:
  5. for /f "tokens=*" %%i in ('wmic logicaldisk where "name='%p%'" get DriveType^,Description^,name  /value') do (
  6.      for /f "tokens=*" %%j in ("%%i") do set %%j
  7. )
  8. echo %name%  %Description%
  9. pause
  10. '@
  11. $pscode=@'
  12. $st = Get-Date   #脚本开头
  13. Get-Process
  14. $et = Get-Date   #脚本结尾
  15. ($et - $st).TotalSeconds   #计算
  16. '@
  17. #不懂ps函数,弄成块了
  18. $easysci={
  19. param($thetext,$thetype)
  20. #编辑器设置
  21. $editor=[EasyScintilla.SimpleEditor]::new()
  22. $editor.Anchor = ([System.Windows.Forms.AnchorStyles](((([System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Bottom) -bor [System.Windows.Forms.AnchorStyles]::Left) -bor [System.Windows.Forms.AnchorStyles]::Right)))
  23. $editor.IndentationGuides = [ScintillaNET.IndentView]::LookBoth
  24. $editor.Location = [System.Drawing.Point]::new(12, 12)
  25. $editor.Name = "editor"
  26. $editor.Size = [System.Drawing.Size]::new(854, 603)
  27. #$editor.Styler = $null
  28. if($thetype -eq "C#"){$editor.Styler=[EasyScintilla.Stylers.CSharpStyler]::new()}
  29. if($thetype -eq "C# (Dark)"){$editor.Styler=[EasyScintilla.Stylers.DarkCSharpStyler]::new()}
  30. if($thetype -eq "Windows Batch"){$editor.Styler=[EasyScintilla.Stylers.BatchStyler]::new()}
  31. if($thetype -eq "HTML"){$editor.Styler=[EasyScintilla.Stylers.HtmlStyler]::new()}
  32. if($thetype -eq "JSON"){$editor.Styler=[EasyScintilla.Stylers.JsonStyler]::new()}
  33. if($thetype -eq "PowerShell"){$editor.Styler=[EasyScintilla.Stylers.PowerShellStyler]::new()}
  34. if($thetype -eq "Python"){$editor.Styler=[EasyScintilla.Stylers.PythonStyler]::new()}
  35. if($thetype -eq "Ruby"){$editor.Styler=[EasyScintilla.Stylers.RubyStyler]::new()}
  36. if($thetype -eq "T-SQL"){$editor.Styler=[EasyScintilla.Stylers.SqlStyler]::new()}
  37. if($thetype -eq "Teradata Parallel Transporter"){$editor.Styler=[EasyScintilla.Stylers.TptStyler]::new()}
  38. $editor.Text=$thetext
  39. $editor.TabIndex = 0
  40. #窗体设置
  41. $theform=[System.Windows.Forms.Form]::new()
  42. $theform.SuspendLayout()
  43. $theform.AutoScaleDimensions=[System.Drawing.SizeF]::new(6, 13)
  44. $theform.AutoScaleMode=[System.Windows.Forms.AutoScaleMode]::font
  45. $theform.ClientSize=[System.Drawing.Size]::new(878, 656)
  46. $theform.Controls.Add($editor)
  47. $theform.Name = "Form1"
  48. $theform.Text = "EasyScintilla Test App"
  49. $theform.ResumeLayout($false)
  50. #显示窗体,模态
  51. $theform.ShowDialog()
  52. #清空
  53. $editor=$null
  54. $theform.Dispose()
  55. $theform=$null
  56. #返回
  57. return 0
  58. }
  59. #调用块,参数1为文本字符串,参数2为语言样式字符串
  60. $easysci.Invoke($batcode,'Windows Batch')
  61. #$easysci.Invoke($pscode,'PowerShell')
复制代码

作者: 小白龙    时间: 2023-4-8 07:12

回复 4# Five66


    大佬, 高手, 成了!  太感谢了
作者: 小白龙    时间: 2023-4-8 07:13

本帖最后由 小白龙 于 2023-4-8 07:18 编辑

回复 3# jyswjjgdwtdtj

您也很热心, 帮了我不少忙, 同样感谢
作者: 小白龙    时间: 2023-4-8 07:15

回复 4# Five66

现在, 有个小问题, 关闭窗口后, 没有返回修改后的编辑器中的代码, 是不是要添加一个 确定 按钮, 才行呢? 怎么加呢
作者: Five66    时间: 2023-4-8 08:05

回复 7# 小白龙

在外面添加一个变量,清空前(第59行前)将$editor.Text赋值给这个变量,然后使用这个变量
作者: 小白龙    时间: 2023-4-8 20:06

本帖最后由 小白龙 于 2023-4-8 20:46 编辑

回复 8# Five66

大佬能再帮指导一下吗?
我用的软件虽然可以执行上面的PS脚本, 但是也是用命令行的方式调用的, 执行速度有点慢,
但是软件也能调用DLL, 以前在别的贴子中尝试过, 执行速度很快,
我大致知道了从C#代码转出COM版的DLL文件了, 但是不知道怎样把上面用到的两个CS文件合并为一个CS文件, 确切的说, 不知道怎样转成类库

估计应该要修改原C#代码, 把下拉列表组合框删除, 放上一个ok按钮
然后定义一个函数EasySci 返回值类型为string 参数有两个, 一个是要显示的代码, 另一个是代码类型
public string EasySci (string code, string codeType)
作者: 小白龙    时间: 2023-4-8 20:12

找了很多gpt文章, 没一个能用的, 想尝试问它, 也问不了,
作者: 小白龙    时间: 2023-4-8 20:49

本帖最后由 小白龙 于 2023-4-8 20:52 编辑

回复 4# Five66

大佬, 您改的PS代码,我能看懂, 但是源C#的代码,太啰嗦了, 好几个文件, 还一层套一层的, 搞不懂了

因为要生成类库, 所以不需要main函数, 就用我上面提到的函数名就行, 但是怎么改呢, Program.cs   Form1.cs    Form1.Designer.cs  这三个文件是不是都得要改一下
作者: Five66    时间: 2023-4-9 06:29

Program.cs   是执行程序代码
Form1.cs   界面交互代码
Form1.Designer.cs 界面设计代码
这三个文件基本上是可以并一起的,只要调整下那些using

至于弄成你说的类库,参考下面的,C#跟winform都只是略懂毛毛雨,不知对不对
EasySci函数(第123行)定义在Nakano类(第105行)中
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using EasyScintilla.Stylers;
  11. using System.IO;
  12. using System.Reflection;
  13. namespace ExampleProject
  14. {
  15.     public partial class Form1 : Form
  16.     {
  17.         private EasyScintilla.SimpleEditor editor;//编辑器声明
  18.         private System.Windows.Forms.Button theButton;//按钮声明
  19.         private String thertStr //返回字符串声明
  20.          ///<summary>
  21.         /// Required designer variable.
  22.         /// </summary>
  23.         private System.ComponentModel.IContainer components = null;
  24.         /// <summary>
  25.         /// Clean up any resources being used.
  26.         ///重定义Form1释放函数
  27.         /// </summary>
  28.         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  29.         protected override void Dispose(bool disposing)
  30.         {
  31.             if (disposing && (components != null))
  32.             {
  33.                 components.Dispose();
  34.             }
  35.             base.Dispose(disposing);
  36.         }
  37.         //定义Form1关闭事件函数,用于关闭时储存编辑器文本
  38.         private void Form1_Closing(object sender, EventArgs e){thertStr=editor.Text;}
  39.         //Form1构造函数
  40.         public Form1()
  41.         {
  42.             InitializeComponent();//调用初始化函数
  43.         }
  44.         #region Windows Form Designer generated code
  45.         /// <summary>
  46.         /// Required method for Designer support - do not modify
  47.         /// the contents of this method with the code editor.
  48.         ///初始化函数定义
  49.         /// </summary>
  50.         private void InitializeComponent()
  51.         {
  52.             this.editor = new EasyScintilla.SimpleEditor();//创建编辑器
  53.             this.theButton = new System.Windows.Forms.Button();//创建按钮
  54.             this.SuspendLayout();
  55.             //
  56.             // editor设置
  57.             //
  58.             this.editor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
  59.             | System.Windows.Forms.AnchorStyles.Left)
  60.             | System.Windows.Forms.AnchorStyles.Right)));
  61.             this.editor.IndentationGuides = ScintillaNET.IndentView.LookBoth;
  62.             this.editor.Location = new System.Drawing.Point(12, 12);
  63.             this.editor.Name = "editor";
  64.             this.editor.Size = new System.Drawing.Size(854, 603);
  65.             this.editor.Styler = null;
  66.             this.editor.TabIndex = 0;
  67.             //
  68.             // 按钮设置
  69.             //
  70.             this.theButton.Size=new System.Drawing.Size(100, 21);
  71.             this.theButton.Location=new System.Drawing.Point(12, 621);
  72.             this.theButton.Name="button1";
  73.             this.theButton.Text="OK";
  74.             //
  75.             // Form1设置
  76.             //
  77.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  78.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  79.             this.ClientSize = new System.Drawing.Size(878, 656);
  80.             this.Controls.Add(this.theButton);//添加按钮到Form1
  81.             this.Controls.Add(this.editor);//添加编辑器到Form1
  82.             this.Name = "Form1";
  83.             this.Text = "EasyScintilla Test App";
  84.             //this.Load += new System.EventHandler(this.Form1_Load);
  85.             this.Closing += new System.EventHandler(this.Form1_Closing);//添加关闭事件
  86.             this.ResumeLayout(false);
  87.         }
  88.         #endregion
  89.     }
  90. //========================================
  91. //========================================
  92. public class Nakano{
  93. //语言样式字段
  94. private Hashtable _theStyler=new Hashtable();
  95. _theStyler.Add("C#", new CSharpStyler());
  96. _theStyler.Add("C# (Dark)", new DarkCSharpStyler());
  97. _theStyler.Add("Windows Batch" new BatchStyler());
  98. _theStyler.Add("HTML",  new HtmlStyler());
  99. _theStyler.Add("JSON",  new JsonStyler());
  100. _theStyler.Add("PowerShell",  new PowerShellStyler());
  101. _theStyler.Add("Python", new PythonStyler());
  102. _theStyler.Add("Ruby", new RubyStyler());
  103. _theStyler.Add("T-SQL", new SqlStyler());
  104. _theStyler.Add("Teradata Parallel Transporter", new TptStyler());
  105. //语言样式属性
  106. public static Hashtable TheStyler{get {return _theStyler;}}
  107. public static string EasySci (string code, string codeType)
  108. {
  109. var theForm1=new Form1();
  110. string theStr='';
  111. if(_theStyler.ContainsKey(codeType))
  112. {
  113. theForm1.editor.Styler=_theStyler[codeType];
  114. }
  115. theForm1.editor.Text=code;
  116. theForm1.ShowDialog();
  117. theStr=new String(theForm1.thertStr);
  118. theForm1.Dispose();
  119. return theStr;
  120. }
  121. }
  122. //========================================
  123. //========================================
  124. }
复制代码

作者: 小白龙    时间: 2023-4-9 07:19

回复 12# Five66

多谢大佬,

109-118行, 都报下面的错误

error CS1519: 类、结构或接口成员声明中的标记“(”无效
error CS1520: 方法必须具有返回类型
error CS1002: 应输入 ;
作者: 小白龙    时间: 2023-4-9 08:48

本帖最后由 小白龙 于 2023-4-9 08:50 编辑

回复 12# Five66


    问了一下gpt

这段代码中有以下几个问题:

在定义语言样式字段 _theStyler 时,应该在方法或构造函数中进行初始化,而不是在类体外进行初始化。
在定义语言样式字段 _theStyler 时,缺少逗号。
在 EasySci 方法中使用 _theStyler 时,应该使用 Nakano._theStyler,因为 _theStyler 是 Nakano 类的字段。
在调用 Dispose() 方法之前,应该先隐藏窗口并将其设置为不可见。
下面是修改后的代码:
  1. using System;
  2. using System.Collections;
  3. using System.Windows.Forms;
  4. using EasyScintilla.Stylers;
  5. namespace ExampleProject
  6. {
  7.     public partial class Form1 : Form
  8.     {
  9.         private readonly EasyScintilla.SimpleEditor editor;//编辑器声明
  10.         private readonly Button theButton;//按钮声明
  11.         public string ThertStr; //返回字符串声明
  12.         /// <summary>
  13.         /// Required designer variable.
  14.         /// </summary>
  15.         private readonly System.ComponentModel.IContainer components = null;
  16.         /// <summary>
  17.         /// Clean up any resources being used.
  18.         ///重定义Form1释放函数
  19.         /// </summary>
  20.         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  21.         protected override void Dispose(bool disposing)
  22.         {
  23.             if (disposing && (components != null))
  24.             {
  25.                 components.Dispose();
  26.             }
  27.             base.Dispose(disposing);
  28.         }
  29.         //定义Form1关闭事件函数,用于关闭时储存编辑器文本
  30.         private void Form1_Closing(object sender, EventArgs e)
  31.         {
  32.             ThertStr = editor.Text;
  33.         }
  34.         //Form1构造函数
  35.         public Form1()
  36.         {
  37.             InitializeComponent();//调用初始化函数
  38.             editor = new EasyScintilla.SimpleEditor();//创建编辑器
  39.             theButton = new Button();//创建按钮
  40.             this.SuspendLayout();
  41.             //
  42.             // editor设置
  43.             //
  44.             editor.Anchor = ((AnchorStyles) (((AnchorStyles.Top | AnchorStyles.Bottom)
  45.                                                 | AnchorStyles.Left)
  46.                                                | AnchorStyles.Right));
  47.             editor.IndentationGuides = ScintillaNET.IndentView.LookBoth;
  48.             editor.Location = new System.Drawing.Point(12, 12);
  49.             editor.Name = "editor";
  50.             editor.Size = new System.Drawing.Size(854, 603);
  51.             editor.Styler = null;
  52.             editor.TabIndex = 0;
  53.             //
  54.             // 按钮设置
  55.             //
  56.             theButton.Size=new System.Drawing.Size(100, 21);
  57.             theButton.Location=new System.Drawing.Point(12, 621);
  58.             theButton.Name="button1";
  59.             theButton.Text="OK";
  60.             this.Controls.Add(theButton);//添加按钮到Form1
  61.             this.Controls.Add(editor);//添加编辑器到Form1
  62.             this.ResumeLayout(false);
  63.         }
  64.     }
  65.     //========================================
  66.     public class Nakano {
  67.         //语言样式字段
  68.         private static readonly Hashtable _theStyler=new Hashtable() {
  69.             {"C#", new CSharpStyler()},
  70.             {"C# (Dark)", new DarkCSharpStyler()},
  71.             {"Windows Batch", new BatchStyler()},
  72.             {"HTML", new HtmlStyler()},
  73.             {"JSON", new JsonStyler()},
  74.             {"PowerShell", new PowerShellStyler()},
  75.             {"Python", new PythonStyler()},
  76.             {"Ruby", new RubyStyler()},
  77.             {"T-SQL", new SqlStyler()},
  78.             {"Teradata Parallel Transporter", new TptStyler()}
  79.         };
  80.         //语言样式属性
  81.         public static Hashtable TheStyler => _theStyler;
  82.         
  83.         public static string EasySci(string code, string codeType)
  84.         {
  85.             var theForm1 = new Form1();
  86.             var theStr = "";
  87.             if (_theStyler.ContainsKey(codeType))
  88.             {
  89.                 theForm1.editor.Styler = (IStyler) _theStyler[codeType];
  90.             }
  91.         
  92.             theForm1.editor.Text = code;
  93.         
  94.             theForm1.ShowDialog();
  95.         
  96.             theStr = theForm1.ThertStr;
  97.         
  98.             theForm1.Hide();
  99.             theForm1.Visible = false;
  100.             theForm1.Dispose();
  101.         
  102.             return theStr;
  103.         }
  104.     }
  105. //========================================
  106. }
复制代码

作者: 小白龙    时间: 2023-4-9 08:53

回复 12# Five66


    GPT答案, 下面这行,还是提示有错误
        //语言样式属性
        public static Hashtable TheStyler => _theStyler;

--------------------------------------------------------------------
error CS1002: 应输入 ;
error CS1519: 类、结构或接口成员声明中的标记“;”无效.
作者: Five66    时间: 2023-4-9 08:59

试试原来108行后面所有换成下面的
  1. private static Hashtable _theStyler=new Hashtable();
  2. private static int _initiga=0;
  3. private static void theInit(){
  4. _theStyler.Add("C#", new CSharpStyler());
  5. _theStyler.Add("C# (Dark)", new DarkCSharpStyler());
  6. _theStyler.Add("Windows Batch" ,new BatchStyler());
  7. _theStyler.Add("HTML",  new HtmlStyler());
  8. _theStyler.Add("JSON",  new JsonStyler());
  9. _theStyler.Add("PowerShell",  new PowerShellStyler());
  10. _theStyler.Add("Python", new PythonStyler());
  11. _theStyler.Add("Ruby", new RubyStyler());
  12. _theStyler.Add("T-SQL", new SqlStyler());
  13. _theStyler.Add("Teradata Parallel Transporter", new TptStyler());
  14. }
  15. //语言样式属性
  16. public static Hashtable TheStyler{
  17. get {
  18. if(_initiga==0){theInit();_initiga=1;return _theStyler;}
  19. return _theStyler;}}
  20. public static string EasySci (string code, string codeType)
  21. {
  22. if(_initiga==0){_initiga=1;theInit();}
  23. var theForm1=new Form1();
  24. StringBuilder theStr;
  25. if(_theStyler.ContainsKey(codeType))
  26. {
  27. theForm1.editor.Styler=_theStyler[codeType];
  28. }
  29. theForm1.editor.Text=code;
  30. theForm1.ShowDialog();
  31. theStr=new StringBuilder(theForm1.thertStr);
  32. theForm1.Dispose();
  33. return theStr.ToString();
  34. }
  35. }
  36. //========================================
  37. //========================================
  38. }
复制代码

作者: 小白龙    时间: 2023-4-9 09:32

回复 16# Five66


    theForm1.editor.Styler=_theStyler[codeType];
会报错
error CS0266: 无法将类型“object”隐式转换为“EasyScintilla.Stylers.ScintillaStyler”。存在一个显式转换(是否缺少强制转换?).
我改成
theForm1.editor.Styler=(ScintillaStyler)_theStyler[codeType];
不报错了, 但是又报下面的错了, 两个dll都引用了EasyScintilla.dll   ScintillaNET.dll

        Could not load the Scintilla module at the path 'C:\Users\Administrator\AppData\Local\Temp\ScintillaNET\3.6.3\x86\SciLexer.dll'.
        在 ScintillaNET.Scintilla.get_CreateParams()
        在 System.Windows.Forms.Control..ctor(Boolean autoInstallSyncContext)
        在 ScintillaNET.Scintilla..ctor()
        在 EasyScintilla.SimpleEditor..ctor()
        在 ExampleProject.Form1.InitializeComponent()
        在 ExampleProject.Form1..ctor()
        在 ExampleProject.Nakano.EasySci(String code, String codeType).
作者: 小白龙    时间: 2023-4-9 09:35

回复 16# Five66


   是不是要把 EasyScintilla文件夹下的SimpleEditor.cs文件也合并进来? 这个文件太大了10K
感觉是不是哪里有问题, 用powershell几行代码就搞定了, 但用C#有点复杂, 是不是不合并也行呢?

powershell代码只需要那两个dll就行了
作者: 小白龙    时间: 2023-4-9 09:39

private EasyScintilla.SimpleEditor editor;//编辑器声明
                private System.Windows.Forms.Button theButton;//按钮声明
                private String thertStr; //返回字符串声明

我也改成了下面这样, 不然会提示   不可访问,因为它受保护级别限制

                public EasyScintilla.SimpleEditor editor;//编辑器声明
                public System.Windows.Forms.Button theButton;//按钮声明
                public String thertStr; //返回字符串声明
作者: Five66    时间: 2023-4-9 10:00

代码编译依赖 EasyScintilla.dll , 编译运行后也依赖 EasyScintilla.dll
EasyScintilla.dll 运行依赖 ScintillaNET.dll
ScintillaNET.dll 运行依赖 SciLexer.dll (大概)

按理来说改成
(ScintillaStyler)_theStyler[codeType];
和那些 public XXX
应该能通过编译的
作者: 小白龙    时间: 2023-4-9 10:02

本帖最后由 小白龙 于 2023-4-9 10:03 编辑

回复 20# Five66

C:\Users\Administrator\AppData\Local\Temp\ScintillaNET\3.6.3\x86\SciLexer.dll
    我在报错的这个路径下看了一下, 是有这个dll文件的, 这个文件, 应该是打包在ScintillaNET.dll中了, 执行的时候就解包了?
作者: Five66    时间: 2023-4-9 10:06

回复 21# 小白龙

试试开头再加上一句
using EasyScintilla:
作者: Five66    时间: 2023-4-9 10:07

回复 21# 小白龙
你用的啥编译的?最好发下编译错误的图来看看
作者: Five66    时间: 2023-4-9 10:14

回复 23# Five66

看路径,你的SciLexer.dll是应该是32位的,试试编译32位的
作者: 小白龙    时间: 2023-4-9 10:35

本帖最后由 小白龙 于 2023-4-9 10:39 编辑

回复 24# Five66


    应该就是32位的, 这个好像没有64似的
https://github.com/jacobslusser/ScintillaNET/releases/tag/v3.6.3

对了, 忘了一点, 我的软件它只支持调用32位的dll 会不会咱们上面两个dll都是64位的? 怎么看是不是64位的dll呢

好像v3的时候, 没有64位的版本的dll
作者: Five66    时间: 2023-4-9 10:59

回复 25# 小白龙
那就编译成32位的,用自带的C#编译器试了下,能成功编译成dll

编译编译命令为(csc改成自己系统的csc路径)
  1. csc  /r:EasyScintilla.dll /r:ScintillaNET.dll /target:library "new 1"
复制代码
代码文件"new 1"跟 EasyScintilla.dll 和 ScintillaNET.dll 放在同一文件夹(只有这3个文件)

还有代码文件改了下,看下面的
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using EasyScintilla.Stylers;
  12. using EasyScintilla;
  13. using System.IO;
  14. using System.Reflection;
  15. namespace ExampleProject
  16. {
  17.     public partial class Form1 : Form
  18.     {
  19.         public EasyScintilla.SimpleEditor editor;//编辑器声明
  20.         public System.Windows.Forms.Button theButton;//按钮声明
  21.         public String thertStr; //返回字符串声明
  22.          ///<summary>
  23.         /// Required designer variable.
  24.         /// </summary>
  25.         private System.ComponentModel.IContainer components = null;
  26.         /// <summary>
  27.         /// Clean up any resources being used.
  28.         ///重定义Form1释放函数
  29.         /// </summary>
  30.         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  31.         protected override void Dispose(bool disposing)
  32.         {
  33.             if (disposing && (components != null))
  34.             {
  35.                 components.Dispose();
  36.             }
  37.             base.Dispose(disposing);
  38.         }
  39.         //定义Form1关闭事件函数,用于关闭时储存编辑器文本
  40.         private void Form1_Closing(object sender, EventArgs e){thertStr=editor.Text;}
  41.         //Form1构造函数
  42.         public Form1()
  43.         {
  44.             InitializeComponent();//调用初始化函数
  45.         }
  46.         #region Windows Form Designer generated code
  47.         /// <summary>
  48.         /// Required method for Designer support - do not modify
  49.         /// the contents of this method with the code editor.
  50.         ///初始化函数定义
  51.         /// </summary>
  52.         private void InitializeComponent()
  53.         {
  54.             this.editor = new EasyScintilla.SimpleEditor();//创建编辑器
  55.             this.theButton = new System.Windows.Forms.Button();//创建按钮
  56.             this.SuspendLayout();
  57.             //
  58.             // editor设置
  59.             //
  60.             this.editor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
  61.             | System.Windows.Forms.AnchorStyles.Left)
  62.             | System.Windows.Forms.AnchorStyles.Right)));
  63.             this.editor.IndentationGuides = ScintillaNET.IndentView.LookBoth;
  64.             this.editor.Location = new System.Drawing.Point(12, 12);
  65.             this.editor.Name = "editor";
  66.             this.editor.Size = new System.Drawing.Size(854, 603);
  67.             this.editor.Styler = null;
  68.             this.editor.TabIndex = 0;
  69.             //
  70.             // 按钮设置
  71.             //
  72.             this.theButton.Size=new System.Drawing.Size(100, 21);
  73.             this.theButton.Location=new System.Drawing.Point(12, 621);
  74.             this.theButton.Name="button1";
  75.             this.theButton.Text="OK";
  76.             //
  77.             // Form1设置
  78.             //
  79.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  80.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  81.             this.ClientSize = new System.Drawing.Size(878, 656);
  82.             this.Controls.Add(this.theButton);//添加按钮到Form1
  83.             this.Controls.Add(this.editor);//添加编辑器到Form1
  84.             this.Name = "Form1";
  85.             this.Text = "EasyScintilla Test App";
  86.             //this.Load += new System.EventHandler(this.Form1_Load);
  87.             this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);//添加关闭事件
  88.             this.ResumeLayout(false);
  89.         }
  90.         #endregion
  91.     }
  92. //========================================
  93. //========================================
  94. public class Nakano{
  95. //语言样式字段
  96. private static Hashtable _theStyler=new Hashtable();
  97. private static int _initiga=0;
  98. private static void theInit(){
  99. _theStyler.Add("C#", new CSharpStyler());
  100. _theStyler.Add("C# (Dark)", new DarkCSharpStyler());
  101. _theStyler.Add("Windows Batch" ,new BatchStyler());
  102. _theStyler.Add("HTML",  new HtmlStyler());
  103. _theStyler.Add("JSON",  new JsonStyler());
  104. _theStyler.Add("PowerShell",  new PowerShellStyler());
  105. _theStyler.Add("Python", new PythonStyler());
  106. _theStyler.Add("Ruby", new RubyStyler());
  107. _theStyler.Add("T-SQL", new SqlStyler());
  108. _theStyler.Add("Teradata Parallel Transporter", new TptStyler());
  109. }
  110. //语言样式属性
  111. public static Hashtable TheStyler{
  112. get {
  113. if(_initiga==0){theInit();_initiga=1;return _theStyler;}
  114. return _theStyler;}}
  115. public static string EasySci (string code, string codeType)
  116. {
  117. if(_initiga==0){_initiga=1;theInit();}
  118. var theForm1=new Form1();
  119. StringBuilder theStr;
  120. if(_theStyler.ContainsKey(codeType))
  121. {
  122. theForm1.editor.Styler=(ScintillaStyler)_theStyler[codeType];
  123. }
  124. theForm1.editor.Text=code;
  125. theForm1.ShowDialog();
  126. theStr=new StringBuilder(theForm1.thertStr);
  127. theForm1.Dispose();
  128. return theStr.ToString();
  129. }
  130. }
  131. //========================================
  132. //========================================
  133. }
复制代码

作者: Five66    时间: 2023-4-9 11:01

回复 26# Five66

差点忘了,我用32位系统编译的,64位系统建议下载dotnet编译成32位的
作者: 小白龙    时间: 2023-4-9 11:11

本帖最后由 小白龙 于 2023-4-9 11:12 编辑

回复 26# Five66

多谢大佬, 我用软件带的编译工具编译的, 不成功

用您刚才上面的代码和命令可以编译成功, 因为软件带的编译工具可以转成com的dll

如果不用带的编译工具, 而用VS2022来编译生成com, 我应该怎么做呢? 我的软件虽然支持DLL, 但是只支持com的, 不支持.net的dll, 要添加GUID参数什么的
作者: Five66    时间: 2023-4-9 11:12

回复 27# Five66

哦不对,是64位,64位系统的csc能成功编译
系统自带的也有32位的编译器,应该能直接用32位编译器编译32位的,不用再装dotnet
作者: Five66    时间: 2023-4-9 11:14

回复 28# 小白龙

不懂com,一点都不懂,更不用说C#的com了,实在无能为力
作者: 小白龙    时间: 2023-4-9 11:15

回复 29# Five66
我用的下面的命令编译成功的, 我不知道编译成的dll是多少位的, 我的系统是64位win7

但是代码里面没有生成com的参数什么的,生成的dll我的软件还不能用, 不知道, 能不能用命令生成支持com的dll
  1. @echo off
  2. C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe  /r:EasyScintilla.dll /r:ScintillaNET.dll /target:library "sci.cs"
  3. pause
复制代码

作者: Five66    时间: 2023-4-9 11:17

回复 31# 小白龙

印象中C#的com还要用代码暴露函数的,反正不懂
我只会用com
不会弄com
作者: 小白龙    时间: 2023-4-9 11:17

我的软件在虚拟机里运行, 启动ps的速度慢不少, 不然就不用这么折腾了
但是以前自己生成过支持的com的dll, 用着速度很快
作者: 小白龙    时间: 2023-4-9 11:23

本帖最后由 小白龙 于 2023-4-9 11:25 编辑

回复 32# Five66


    我以前按下面这个教程生成过com的dll 生成的能用, 看样子, 好像就是在名字空间下放了三行代码, 但这是用的VS生成的, 现在打开ExampleProject项目后, 不知道怎么操作了, 因为咱们新生成了一个cs文件

https://www.cnblogs.com/jasonery/p/7987050.html
作者: 小白龙    时间: 2023-4-9 12:45

回复 32# Five66

大佬, 用下面的代码, 可以执行了, 但是点ok按钮, 窗口不关闭
  1. $batcode=@'
  2. @echo off
  3. set p=c:
  4. for /f "tokens=*" %%i in ('wmic logicaldisk where "name='%p%'" get DriveType^,Description^,name  /value') do (
  5.      for /f "tokens=*" %%j in ("%%i") do set %%j
  6. )
  7. echo %name%  %Description%
  8. pause
  9. '@
  10. Add-Type -Path "C:\Users\Administrator\Desktop\o\sci.dll"
  11. [ExampleProject.Nakano]::EasySci($batcode,'Windows Batch')
复制代码

作者: Five66    时间: 2023-4-9 13:07

回复 35# 小白龙

因为代码里本来就没有添加按钮的鼠标点击事件,点击后啥都不会做,自己在代码里参考Form1的加上去吧
作者: Five66    时间: 2023-4-9 13:17

回复 34# 小白龙

看了好多网上的com教程,特么全都是用vs的,细节压根就搞不懂
试试照着下面连接来吧
https://www.jianshu.com/p/be7f61ba7c86

新建的名字用 ExampleProject , 自行添加 EasyScintilla.dll 和 ScintillaNET.dll 引用
代码用下面的(第108行起)
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using EasyScintilla.Stylers;
  12. using EasyScintilla;
  13. using System.IO;
  14. using System.Reflection;
  15. using System.Runtime.InteropServices;
  16. namespace ExampleProject
  17. {
  18.     public partial class Form1 : Form
  19.     {
  20.         public EasyScintilla.SimpleEditor editor;//编辑器声明
  21.         public System.Windows.Forms.Button theButton;//按钮声明
  22.         public String thertStr; //返回字符串声明
  23.          ///<summary>
  24.         /// Required designer variable.
  25.         /// </summary>
  26.         private System.ComponentModel.IContainer components = null;
  27.         /// <summary>
  28.         /// Clean up any resources being used.
  29.         ///重定义Form1释放函数
  30.         /// </summary>
  31.         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  32.         protected override void Dispose(bool disposing)
  33.         {
  34.             if (disposing && (components != null))
  35.             {
  36.                 components.Dispose();
  37.             }
  38.             base.Dispose(disposing);
  39.         }
  40.         //定义Form1关闭事件函数,用于关闭时储存编辑器文本
  41.         private void Form1_Closing(object sender, EventArgs e){thertStr=editor.Text;}
  42.         //Form1构造函数
  43.         public Form1()
  44.         {
  45.             InitializeComponent();//调用初始化函数
  46.         }
  47.         #region Windows Form Designer generated code
  48.         /// <summary>
  49.         /// Required method for Designer support - do not modify
  50.         /// the contents of this method with the code editor.
  51.         ///初始化函数定义
  52.         /// </summary>
  53.         private void InitializeComponent()
  54.         {
  55.             this.editor = new EasyScintilla.SimpleEditor();//创建编辑器
  56.             this.theButton = new System.Windows.Forms.Button();//创建按钮
  57.             this.SuspendLayout();
  58.             //
  59.             // editor设置
  60.             //
  61.             this.editor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
  62.             | System.Windows.Forms.AnchorStyles.Left)
  63.             | System.Windows.Forms.AnchorStyles.Right)));
  64.             this.editor.IndentationGuides = ScintillaNET.IndentView.LookBoth;
  65.             this.editor.Location = new System.Drawing.Point(12, 12);
  66.             this.editor.Name = "editor";
  67.             this.editor.Size = new System.Drawing.Size(854, 603);
  68.             this.editor.Styler = null;
  69.             this.editor.TabIndex = 0;
  70.             //
  71.             // 按钮设置
  72.             //
  73.             this.theButton.Size=new System.Drawing.Size(100, 21);
  74.             this.theButton.Location=new System.Drawing.Point(12, 621);
  75.             this.theButton.Name="button1";
  76.             this.theButton.Text="OK";
  77.             //
  78.             // Form1设置
  79.             //
  80.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  81.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  82.             this.ClientSize = new System.Drawing.Size(878, 656);
  83.             this.Controls.Add(this.theButton);//添加按钮到Form1
  84.             this.Controls.Add(this.editor);//添加编辑器到Form1
  85.             this.Name = "Form1";
  86.             this.Text = "EasyScintilla Test App";
  87.             //this.Load += new System.EventHandler(this.Form1_Load);
  88.             this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);//添加关闭事件
  89.             this.ResumeLayout(false);
  90.         }
  91.         #endregion
  92.     }
  93. //========================================
  94. //========================================
  95. [Guid("E2032C8D-2E32-4415-8E8C-CFACBCAAADFF")]
  96. public interface TheCom{
  97. [DispId(1)]
  98. public string EasySci (string code, string codeType);
  99. }
  100. [Guid("BF4EFCF8-8F67-46F2-A84F-E88C8C3DD777"),
  101. ClassInterface(ClassInterfaceType.None)]//,
  102. //ComSourceInterfaces(typeof(TheCom))]
  103. [ProgId("ExampleProject.Application")]
  104. public class Nakano : TheCom{
  105. public string EasySci (string code, string codeType)
  106. {
  107. Hashtable theStyler=new Hashtable();
  108. theStyler.Add("C#", new CSharpStyler());
  109. theStyler.Add("C# (Dark)", new DarkCSharpStyler());
  110. theStyler.Add("Windows Batch" ,new BatchStyler());
  111. theStyler.Add("HTML",  new HtmlStyler());
  112. theStyler.Add("JSON",  new JsonStyler());
  113. theStyler.Add("PowerShell",  new PowerShellStyler());
  114. theStyler.Add("Python", new PythonStyler());
  115. theStyler.Add("Ruby", new RubyStyler());
  116. theStyler.Add("T-SQL", new SqlStyler());
  117. theStyler.Add("Teradata Parallel Transporter", new TptStyler());
  118. var theForm1=new Form1();
  119. StringBuilder theStr;
  120. if(_theStyler.ContainsKey(codeType))
  121. {
  122. theForm1.editor.Styler=(ScintillaStyler)_theStyler[codeType];
  123. }
  124. theForm1.editor.Text=code;
  125. theForm1.ShowDialog();
  126. theStr=new StringBuilder(theForm1.thertStr);
  127. theForm1.Dispose();
  128. return theStr.ToString();
  129. }
  130. }
  131. //========================================
  132. //========================================
  133. }
复制代码

作者: 小白龙    时间: 2023-4-9 13:18

本帖最后由 小白龙 于 2023-4-9 13:19 编辑

回复 36# Five66

好的, 不加也行, 直接关窗口也能输出了

前面那个报x86 dll错误, 感觉应该是版本的问题, 我在powershell调用成功时, 临时解压的文件如下, 不是以前报错的那个x86\SciLexer.dll  但是想解决这个问题, 这x86的dll从哪里找呢
"C:\Users\Administrator\AppData\Local\Temp\ScintillaNET\3.6.3\x64\SciLexer.dll"

难道我生成的dll不是x86的吗?  我的软件支持的dll只能是x86的, x64的不行, 这点可以确认
作者: Five66    时间: 2023-4-9 13:33

回复 38# 小白龙

    SciLexer.dll应该是EasyScintilla.dll调用ScintillaNET.dll时,由ScintillaNET.dll生成的吧
    报错问题搞不懂
    vs的生成设置里可以设置32或64吧
    自带编译器看所在目录:Framework64下的csc是64位,Framework下的csc是32位
作者: 小白龙    时间: 2023-4-9 13:44

本帖最后由 小白龙 于 2023-4-9 13:45 编辑

回复 39# Five66

下面是ScintillaNET说明文档中说的,  和我想的一样, 下面红色字部分, 这么一来, 我的软件只支持x86的dll, 它在调用的dll的时候, 就解出了x86版的SciLexer.DLL 那哪里出问题了呢?
我用的是下面路径的csc这应该是x86版的, 因为还有一个csc文件在 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    第二个最常见的ScintillaNET问题是混淆了ScintillaNET DLL及其本地组件SciLexer.DLL。ScintillaNET是一个包装器。没有包含核心闪烁功能的SciLexer.dll,它什么都不是。作为一个本地组件,SciLexer.dll必须为32位和64位版本的Windows分别编译。因此,实际上开发人员必须在应用程序中附带三个dll。

这被证明是一个痛点,因为开发人员通常不希望发布这么多库,或者希望将它们放在另一个位置,这会破坏PInvoke和cintillanet使用的DLL加载机制。由于同样的原因,它在Visual Studio的设计期间也会引起头痛。

为了解决这个问题,现在在ScintillaNET DLL中嵌入了32位和64位版本的SciLexer.DLL。在一个库中运行ScintillaNET所需的所有东西。除了缓解上面提到的痛苦之外,现在我们可以创建一个ScintillaNET NuGet包。
作者: Five66    时间: 2023-4-10 06:49

回复 40# 小白龙

啊,原来搞错了,自带C#编译器csc跟C,C++编译器cl不一样,不管32位还是64位的csc默认编译生成都是AnyCpu(AnyCpu是根据运行系统或调用程序自动适用32位或64位,简单来讲就是二合一)
EasyScintilla.dll 跟 ScintillaNET.dll 也都是AnyCpu (dotnetSDK里的工具CorFlags.exe可以查看,VS有带此工具)

因此出错猜测可能是为了检查类型或Debug附加把SciLexer.dll当成dotnet的dll来解释了(试试换成release)
也有可能为了安全或独立不加载临时目录里的dll(试试直接复制到项目对应的目录里)
作者: 小白龙    时间: 2023-4-10 11:17

本帖最后由 小白龙 于 2023-4-10 11:20 编辑

回复 41# Five66

感谢大佬, 我被搞的筋疲力尽了快, 太难了

我用x86版的 powershell ISE 执行代码, 临时目录里也有那个x86 的 dll , 也能正常运行,
但是把C#代码按网上教程转成com的dll就不行了, 总是报错

scintillaNET看官方说明中, 它就是把x86和x64的dll整到一块的
作者: Five66    时间: 2023-4-11 09:39

回复 42# 小白龙

终于搞懂大部分细节啦,有兴趣就按下面的试试看吧

将最下面代码复制粘贴并保存,并将ScintillaNET.dll , EasyScintilla.dll跟代码文件放在同一文件夹(只有这3个文件),
然后打开cmd,定位到当前目录,用自带编译器编译成dll (thecom为代码文件 , csc路径改成自己的)
  1. csc /r:ScintillaNET.dll /r:EasyScintilla.dll  /target:library thecom
复制代码
接着用sn.exe生成强名key文件,thekey.snk是key文件名
(sn.exe路径改成自己的,sn.exe是dotnetSDK的工具,vs自带)
  1. sn.exe -k thekey.snk
复制代码
然后用ildasm.exe反编译之前生成的dll,thecom.dll是之前生成的dll名字, thecom.il是输出的il文件名
(ildasm.exe路径改成自己的,ildasm.exe是dotnetSDK的工具,vs自带)
  1. ildasm.exe thecom.dll /OUT:thecom.il
复制代码
删掉之前生成的dll

接着用自带的 il 编译器将 il 文件和 res 文件和 key 文件一起重新编译成 dll 文件
(ilasm路径改成自己的,系统自带)
  1. ilasm thecom.il /DLL /OUTPUT=thecom.dll /KEY=thekey.snk /RESOURCE=thecom.res
复制代码
最后注册 dll (需要管理员权限)
(regasm系统自带 , gacutil.exe是dotnetSDK的工具,vs自带,路径都改成自己的)
  1. regasm thecom.dll
  2. gacutil.exe /i thecom.dll
复制代码
完了之后就测试实际代码能不能用吧(估计不行)
ProgId是ExampleProject.Application
ps 中的话是 new-object -comobject ExampleProject.Application

cs代码:
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using EasyScintilla.Stylers;
  12. using EasyScintilla;
  13. using System.IO;
  14. using System.Reflection;
  15. using System.Runtime.InteropServices;
  16. namespace ExampleProject
  17. {
  18.     public partial class Form1 : Form
  19.     {
  20.         public EasyScintilla.SimpleEditor editor;//编辑器声明
  21.         public System.Windows.Forms.Button theButton;//按钮声明
  22.         public String thertStr; //返回字符串声明
  23.          ///<summary>
  24.         /// Required designer variable.
  25.         /// </summary>
  26.         private System.ComponentModel.IContainer components = null;
  27.         /// <summary>
  28.         /// Clean up any resources being used.
  29.         ///重定义Form1释放函数
  30.         /// </summary>
  31.         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  32.         protected override void Dispose(bool disposing)
  33.         {
  34.             if (disposing && (components != null))
  35.             {
  36.                 components.Dispose();
  37.             }
  38.             base.Dispose(disposing);
  39.         }
  40.         //定义Form1关闭事件函数,用于关闭时储存编辑器文本
  41.         private void Form1_Closing(object sender, EventArgs e){thertStr=editor.Text;}
  42.         //Form1构造函数
  43.         public Form1()
  44.         {
  45.             InitializeComponent();//调用初始化函数
  46.         }
  47.         #region Windows Form Designer generated code
  48.         /// <summary>
  49.         /// Required method for Designer support - do not modify
  50.         /// the contents of this method with the code editor.
  51.         ///初始化函数定义
  52.         /// </summary>
  53.         private void InitializeComponent()
  54.         {
  55.             this.editor = new EasyScintilla.SimpleEditor();//创建编辑器
  56.             this.theButton = new System.Windows.Forms.Button();//创建按钮
  57.             this.SuspendLayout();
  58.             //
  59.             // editor设置
  60.             //
  61.             this.editor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
  62.             | System.Windows.Forms.AnchorStyles.Left)
  63.             | System.Windows.Forms.AnchorStyles.Right)));
  64.             this.editor.IndentationGuides = ScintillaNET.IndentView.LookBoth;
  65.             this.editor.Location = new System.Drawing.Point(12, 12);
  66.             this.editor.Name = "editor";
  67.             this.editor.Size = new System.Drawing.Size(854, 603);
  68.             this.editor.Styler = null;
  69.             this.editor.TabIndex = 0;
  70.             //
  71.             // 按钮设置
  72.             //
  73.             this.theButton.Size=new System.Drawing.Size(100, 21);
  74.             this.theButton.Location=new System.Drawing.Point(12, 621);
  75.             this.theButton.Name="button1";
  76.             this.theButton.Text="OK";
  77.             //
  78.             // Form1设置
  79.             //
  80.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  81.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  82.             this.ClientSize = new System.Drawing.Size(878, 656);
  83.             this.Controls.Add(this.theButton);//添加按钮到Form1
  84.             this.Controls.Add(this.editor);//添加编辑器到Form1
  85.             this.Name = "Form1";
  86.             this.Text = "EasyScintilla Test App";
  87.             //this.Load += new System.EventHandler(this.Form1_Load);
  88.             this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);//添加关闭事件
  89.             this.ResumeLayout(false);
  90.         }
  91.         #endregion
  92.     }
  93. //========================================
  94. //========================================
  95. /*
  96. [ComVisible(true)]
  97. [Guid("E2032C8D-2E32-4415-8E8C-CFACBCAAADFF")]
  98. public interface TheCom{
  99. [DispId(1)]
  100. string EasySci (string code, string codeType);
  101. }
  102. */
  103. [ComVisible(true)]
  104. [Guid("BF4EFCF8-8F67-46F2-A84F-E88C8C3DD777"),
  105. ClassInterface(ClassInterfaceType.None)]//,
  106. //ComSourceInterfaces(typeof(TheCom))]
  107. [ProgId("ExampleProject.Application")]
  108. public class Nakano{// : TheCom{
  109. public string EasySci (string code, string codeType)
  110. {
  111. Hashtable theStyler=new Hashtable();
  112. theStyler.Add("C#", new CSharpStyler());
  113. theStyler.Add("C# (Dark)", new DarkCSharpStyler());
  114. theStyler.Add("Windows Batch" ,new BatchStyler());
  115. theStyler.Add("HTML",  new HtmlStyler());
  116. theStyler.Add("JSON",  new JsonStyler());
  117. theStyler.Add("PowerShell",  new PowerShellStyler());
  118. theStyler.Add("Python", new PythonStyler());
  119. theStyler.Add("Ruby", new RubyStyler());
  120. theStyler.Add("T-SQL", new SqlStyler());
  121. theStyler.Add("Teradata Parallel Transporter", new TptStyler());
  122. var theForm1=new Form1();
  123. StringBuilder theStr;
  124. if(theStyler.ContainsKey(codeType))
  125. {
  126. theForm1.editor.Styler=(ScintillaStyler)theStyler[codeType];
  127. }
  128. theForm1.editor.Text=code;
  129. theForm1.ShowDialog();
  130. theStr=new StringBuilder(theForm1.thertStr);
  131. theForm1.Dispose();
  132. return theStr.ToString();
  133. }
  134. }
  135. //========================================
  136. //========================================
  137. }
复制代码

作者: 小白龙    时间: 2023-4-11 12:27

本帖最后由 小白龙 于 2023-4-11 12:30 编辑

回复 43# Five66

多谢大佬热心指导

我现在只装了vs2022就可以操作吗? 还需要别的组件什么的吗?

用自带编译器编译成dll 是用x86的是吧




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2