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

[问题求助] 用powershell生成Dll文件,在其它软件中调用

本帖最后由 小白龙 于 2023-3-27 10:16 编辑

问题是这样的, 我用的一个软件, 它不支持正则中的平衡组, 但是它支持调用dll中的函数, 即然这样, 那能否把平衡组的功能导出为一个dll 然后我在我的软件中变相实现我要的功能呢, 请路过大佬支招, 多谢!

另外还有个小问题, PS直接调用DLL中的函数, 和 DLL中的类代码拷到PS中执行, 执行效率差多少? 怎样分别测试它们两种的执行时间呢?

powershell 是可以直接生成dll的, 我找到了一个小例子, 如下
  1. #生成dll
  2. Add-Type -TypeDefinition @'
  3. using System;
  4. public static class Cla
  5. {
  6.     public static void Fun(string s1)
  7.     {
  8.         Console.WriteLine(s1);
  9.     }
  10. }
  11. '@ -outputType library -outputAssembly ".\hello.dll"
复制代码
  1. #调用Dll中函数
  2. Add-Type -Path "$home\desktop\hello.dll"
  3. $s = "你好,世界!"
  4. [Cla]::Fun($s)
复制代码
关于用平衡组要解决的问题, 在下面贴子
http://www.bathome.net/thread-65471-1-1.html

如果支持用powershell却不能用正则这么奇怪
是不是当命令行用时里面带有特殊号的原因
把命名组的><两个尖括号转义一下或者换成单引号 ‘ 试试

TOP

回复 2# idwma


    多谢大佬,

支持PS也是用命令行的形式调用, 但是执行太慢了

支持调用DLL, 是软件自身功能,执行速度要快多了, 不少编程语言和软件不支持高级的正则, 好像C#的正则支持是最全的

TOP

powershell中的生成dll是托管dll.只能由托管程序(dotnet编写的程序)调用,本机程序需要C++/CLI之类进行封装,不如直接调用powershell

效率的话估计就是动态编译类代码的时间差了,也没差多少,只是每次执行都要编译而已

正则引擎功能区别可以参考https://deerchao.cn/tutorials/regex/diffs.html
PCRE还是不错,虽然我喜欢RUBY的

TOP

回复 4# Five66

感谢大佬指导, 这表真是太全面了, 我查了一下, 那个程序用的perl正则的引擎, 都不支持unicode字符

另外, C#可以生成com, 那个软件支持com, 应该比调用PS快太多了, 我是在虚拟机用的, 启动PS费时间

TOP

回复 5# 小白龙

表参考下就行了,毕竟19年的表
com老古董了,挺复杂的,反正很难懂就是了

ps启动慢的确是个问题,应该可以生成C#程序然后调用吧(启动应该比ps快吧)

TOP

参照帮助里的例子是这样嘛
  1. Add-Type -TypeDefinition @'
  2. using System;
  3. using System.Text.RegularExpressions;
  4. public static class Cla
  5. {
  6.     public static void Fun(string s1,string s2)
  7.     {
  8. Regex rx = new Regex(s2);
  9. MatchCollection matches = rx.Matches(s1);
  10. Console.WriteLine(matches[0].Groups[0].Value);
  11.     }
  12. }
  13. '@ -outputType library -outputAssembly ".\hello.dll"
  14. Add-Type -Path "$home\desktop\hello.dll"
  15. $s = "你好,世界!123"
  16. [cla]::Fun($s,'\d+')
复制代码

TOP

回复 7# idwma

多谢大佬,  确实在我的软件里很快就输出了, 比使用命令行的PS代码, 要快好几倍

怎么写下面贴子的平衡组的C#代码呢?  
http://www.bathome.net/thread-65471-1-1.html

TOP

回复 8# 小白龙

现在不是已经写进去了吗
不清楚具体怎么用的,不会了

TOP

本帖最后由 小白龙 于 2023-3-29 23:45 编辑

回复 9# idwma

请教大佬?

下面第三行中 的abc是变量$s2的值, 那正则应该怎么写呢? 里面怎么套个变量?

$s2='abc'
$s1='xzc abc(s "(abc)"); dfg()';
[regex]::Match($s1, 'abc\((??>[^()]*)|\((?<Open>)|\)(?<-Open>))*(?(Open)(?!))\)').Value;

TOP

回复 10# 小白龙


    是这样拼接起来么
[regex]::Match($s1, $s2+'\((??>[^()]*)|\((?<Open>)|\)(?<-Open>))*(?(Open)(?!))\)').Value;

TOP

回复 11# idwma

多谢大佬, 暂时先不用变量拼接了, 怕出转义问题, 有时间了再专门测试下

TOP

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

回复 7# idwma


    大佬, 上面#7楼的代码中用的下面这句, 只返回了第1组
Console.WriteLine(matches[0].Groups[0].Value);
但是我想输出所有组, 在C#中应该怎样写呢

例如下面这个例子输出了两组, 改成C#应该怎样改? 我的gpt现在用不了, 说使用太频繁了

cls
$text = "This is (a (test) string) with (nested (parentheses))."
[regex]::Matches($text, "(?x)\( ( [^()]* | (?<o>\() | (?<-o>\)) )*(?(o)(?!)) \)").Value

TOP

回复 13# 小白龙


    之前参考文档写的,c#不会呀不知道怎么改
https://learn.microsoft.com/zh-c ... regular-expressions

TOP

返回列表