关于 C#调用 DLL 的疑惑

325 天前
 justdoitzZ

手头有个文件格式转换的 DLL ,正常一个文件格式转换需要 0.4s

首先做了一个小程序,读取了目录下的 100 个需要转换的文件的路径信息,然后 100 个依次进行转换,耗时 0.4* 100 = 40s

然后我把这个小程序复制了一个,成了小程序 2.

小程序和小程序 2 可以同时双开,进行文件转换。速度也加快了。

但是当我尝试在一个程序里面使用 task 或者多线程调用 DLL 里面的文件转换函数的时候,就报错了。DLL 内置了加密狗权限查阅功能,此时就异常了。但是很奇怪的是,小程序 1 和小程序 2 可以同时运行,没有出现机密狗权限的问题。

困扰我好久的问题,有大佬可以解答疑惑吗?

2009 次点击
所在节点    C#
8 条回复
xiangyuecn
325 天前
进程 线程 傻傻分不清
justdoitzZ
325 天前
@xiangyuecn 。。。。刚学 C# 没多久,就会 Debug.WriteLine
xiangyuecn
325 天前
直接用 Process 新开两个子进程进行处理完事
opengps
325 天前
应该是一楼说的问题,反射加载本质类似于拷贝一份到内存里用,所以你多个进程可以并行,但多线程显然程序的内部运行有冲突
opengps
325 天前
换句话说,如果你非要一个程序处理,那么可以先拷贝多份,然后各个线程调用各自的副本文件
devliu1
325 天前
盲猜 dll 里没有处理好多线程
justdoitzZ
325 天前
@devliu1 这个垃圾 DLL 是个黑箱。感觉按照楼上说的处理
justdoitzZ
325 天前
按照兄弟们提供的思路,chatgpt 提供了如下代码,我再调试一下,我感觉可行了
using System.Diagnostics;

// ...

private void button2_Click(object sender, EventArgs e)
{
string path = @"c:\Work\temp\123\";
string[] suffixes = { ".avl", ".sum", ".nsm" };

FileProcessor fileProcessor = new FileProcessor();
fileProcessor.ListFilesRecursively(path, suffixes);

// 获取原始结果
List<FileInfo> sourceFileInfos = fileProcessor.FileInfos;

// 创建新的目标文件信息
List<FileInfo> targetFileInfos = fileProcessor.CreateTargetFileInfos(sourceFileInfos, ".txt");

int processesCount = 10;

for (int i = 0; i < processesCount; i++)
{
int startIdx = i * targetFileInfos.Count / processesCount;
int endIdx = (i == processesCount - 1) ? targetFileInfos.Count : (i + 1) * targetFileInfos.Count / processesCount;

var processFiles = targetFileInfos.GetRange(startIdx, endIdx - startIdx);

ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "YourExecutable.exe", // 替换为实际的可执行文件名
Arguments = $"{string.Join(" ", processFiles.Select(f => $"\"{f.FilePath}\""))}", // 传递文件路径作为参数
WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath), // 设置工作目录
UseShellExecute = false,
CreateNoWindow = true,
};

Process process = new Process { StartInfo = startInfo };
process.Start();
}
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1002885

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX