[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 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
复制代码

TOP

回复 31# 小白龙

印象中C#的com还要用代码暴露函数的,反正不懂
我只会用com
不会弄com

TOP

我的软件在虚拟机里运行, 启动ps的速度慢不少, 不然就不用这么折腾了
但是以前自己生成过支持的com的dll, 用着速度很快

TOP

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

回复 32# Five66


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

https://www.cnblogs.com/jasonery/p/7987050.html

TOP

回复 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')
复制代码

TOP

回复 35# 小白龙

因为代码里本来就没有添加按钮的鼠标点击事件,点击后啥都不会做,自己在代码里参考Form1的加上去吧

TOP

回复 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. }
复制代码

TOP

本帖最后由 小白龙 于 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的不行, 这点可以确认

TOP

回复 38# 小白龙

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

TOP

本帖最后由 小白龙 于 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包。

TOP

回复 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(试试直接复制到项目对应的目录里)

TOP

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

回复 41# Five66

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

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

scintillaNET看官方说明中, 它就是把x86和x64的dll整到一块的

TOP

回复 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. }
复制代码

TOP

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

回复 43# Five66

多谢大佬热心指导

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

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

TOP

返回列表