C# 在Linux上的dotnet应用程序中从进程运行dotnet dll

C# 在Linux上的dotnet应用程序中从进程运行dotnet dll,c#,process,C#,Process,我有一个dotnet core 3.1 web应用程序,它接受文件路径和exe并运行它,但为了利用跨平台功能,我切换到了dotnet core 应用程序正在基于Windows的环境中使用proprocess.Start()我已尝试更改环境变量的扩展名 Windows代码: var process = await Task.Run(() => Process.Start($"{path}/{file}"); 在linux机器上运行时,我得到System.

我有一个dotnet core 3.1 web应用程序,它接受文件路径和exe并运行它,但为了利用跨平台功能,我切换到了dotnet core

应用程序正在基于Windows的环境中使用
proprocess.Start()
我已尝试更改环境变量的扩展名

Windows代码:

var process = await Task.Run(() =>
        Process.Start($"{path}/{file}");
在linux机器上运行时,我得到
System.ComponentModel.Win32Exception(8):Exec格式错误
如果我将文件从
.exe
更改为
.dll
扩展名,但该扩展名不会运行,我认为Wine不是一个选项

我如何通过C#实现这一点,或者它是否需要调用包装器sript

更新

exe和dll都是使用相同的3.1从dotnet核心应用程序构建的,当前使用的代码如下:

                var information = new ProcessStartInfo
                {
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    FileName = Path.Join(this.path, this.file),
                };

var process = await Task.Run(() =>
                        Process.Start(information));
我在Linux设备上遇到的错误:

System.ComponentModel.Win32Exception(8):处的Exec格式错误 System.Diagnostics.Process.ForkAndExecProcess(字符串文件名, 字符串[]argv,字符串[]envp,字符串cwd,布尔重定向stdin, 布尔重定向标准输出,布尔重定向标准输出,布尔 setCredentials,UInt32用户ID,UInt32组ID,UInt32[]组,Int32& stdinFd、Int32和stdoutFd、Int32和stderrFd、布尔usesTerminal、, 布尔throwOnNoExec)


您拥有的Exe文件可能是Windows可执行文件,因此无法在linux上运行

您拥有的.dll文件不是可执行文件,因此您不能直接通过
Process.start
启动它。不过,它可以通过“dotnet”应用程序启动(假设它有入口点),如果您在linux服务器上安装了.NET core framework,那么该应用程序应该已经在path中了。如果路径中不存在,它通常位于/usr/bin/dotnet。如果未安装.NET core,请先安装它。然后,可以通过以下方式运行.dll:

dotnet PathToYour.dll
然后,您的代码变成:

var information = new ProcessStartInfo
{
    UseShellExecute = false,
    CreateNoWindow = true,
    FileName = "dotnet",
    Arguments = Path.Join(this.path, this.file)
};
如果要传递参数,请将它们附加到dll路径之后:

    Arguments = Path.Join(this.path, this.file) + " " + "your arguments here"

请注意,假设目标计算机上安装了.NET core framework,您也可以在windows上以相同的方式运行.dll,因为“dotnet.exe”也存在于windows上,并且工作原理相同。

有几件事,您可能需要使用Path.Join(),以确保代码中引用的路径跨平台兼容,而不考虑操作系统。您可能还希望查看目标运行时环境的构建。如果为linux发布,则不应获得.exe输出。Scott Hanselman写了一篇关于如何做到这一点的很棒的博客()啊,谢谢你,我喜欢路径跨平台兼容的想法,我尝试运行的应用程序不是我自己的,但在任何环境下都有dll和exe。那么你尝试运行的应用程序是什么?它也是.net核心应用程序吗?它也是一个dotnet核心应用程序,如果Windows,它将运行提供的exe,如果Linux,它将在同一路径内运行dll。您需要通过dotnet运行它:“dotnet PathToYour.dll”(假设dotnet二进制文件位于路径中)。因此,在您的例子中,它应该是
Filename=“dotnet”,Arguments=Path.Join(this.Path,this.file)
。如果dotnet不在路径中,则找到它所在的位置并使用绝对路径(通常为“/usr/bin/dotnet”)