我有一些 C# 代码需要调用 Python 脚本数千次,每次传递一个字符串,然后期望返回一个浮点数。python 脚本可以使用任何版本的 Python 运行,所以我不能使用 Iron python。建议我使用 IPC 命名管道。我对此没有经验,并且无法弄清楚如何在 C# 和 Python 之间执行此操作。这是一个简单的过程,还是我正在考虑大量的工作?这是解决我的问题的最佳方法吗?
我正在尝试在C#中创建一个DLL,以便在其他几种语言中使用.我找到了RGiesecke的DllExport,但似乎没有用.它构建得很好并且创建了一个dll,但是当我在Dependency Walker中打开它时它没有显示任何函数,我的调用代码也找不到它们.
我创建了一个新的"类库"项目(VS 2013),然后从NuGet安装了"Unmanaged Exports(DllExport for .Net)".我需要任何项目设置吗?
这是我的代码.
using System;
using System.Collections.Generic;
using System.Text;
using RGiesecke.DllExport;
namespace ToolServiceDLL
{
public class Class1
{
[DllExport("addUp", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static double addUp(double num1, double num2)
{
return num1 + num2;
}
[DllExport("get5", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static int get5()
{
return 5;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在两个程序之间创建一个双向通信通道(一个在Python中,另一个在C#中)
当我在两个C#程序或两个Python程序之间创建命名管道时,一切正常,但是当我尝试(例如)从Python代码连接到C#服务器时,它不起作用:
C#代码:
NamedPipeServerStream server = new NamedPipeServerStream(
"Demo", PipeDirection.InOut, 100, PipeTransmissionMode.Byte,
PipeOptions.None, 4096, 4096)
Run Code Online (Sandbox Code Playgroud)
如果我win32pipe在Python中使用代码块ConnectNamedPipe(它永远不会返回)
p = win32pipe.CreateNamedPipe(
r'\\.\pipe\Demo',
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
1, 65536, 65536,
300,
None)
win32pipe.ConnectNamedPipe(p)
Run Code Online (Sandbox Code Playgroud)
如果我使用open函数,它只是建立一个连接,但没有任何反应:
open( '\\\\.\\pipe\\Demo', 'r+b' )
Run Code Online (Sandbox Code Playgroud)
现在,如果我关闭Python程序,C#服务器只接收来自Python的一个数据项,并System.IO.IOException引发"管道已损坏"消息
我做错了吗?