是否可以从 C# 应用程序连接到 32 位 C++ RPC 服务器应用程序
Is it possible to connect to a 32 bit C++ RPC Server application from a C# application
让我尝试简要解释一下我要在这里完成的工作...
我使用远程过程调用 (RPC) 方法用 C++ 开发了一个客户端应用程序,还用 C++ 开发了一个服务器应用程序。客户端是 64 位的,服务器是 32 位的。这项工作的目标是使用客户端将变量传递给服务器端的函数。然后服务器将使用 32 位 .dll 来处理接收到的数据,并将 return 输出值返回给客户端。这个过程运行良好,我对此非常满意。
我正在使用一个用 C# 开发的 64 位应用程序,它有一个静态 class 用于将变量发送到 .dll 并 return 输出值。因为此应用程序是 64 位的,所以它无法连接到这些计算所需的 32 位 .dll (duh)。
现在我的问题...
有什么方法可以保留我已经用 C++ 开发的进程并从 64 位 C# 项目访问 32 位服务器?有没有更好的方法来解决这一切?
编辑:
我还应该包括我正在使用 rpcrt4.lib,这是我的客户端示例代码。
int main()
{
RPC_STATUS status;
unsigned char* szStringBinding = NULL;
char temppath[MAX_PATH] = {0};
// Creates a string binding handle.
// This function is nothing more than a printf.
// Connection is not done here.
status = RpcStringBindingCompose(
NULL, // UUID to bind to.
reinterpret_cast<unsigned char*>("ncacn_ip_tcp"), // Use TCP/IP
// protocol.
reinterpret_cast<unsigned char*>("localhost"), // TCP/IP network
// address to use.
reinterpret_cast<unsigned char*>("4747"), // TCP/IP port to use.
NULL, // Protocol dependent network options to use.
&szStringBinding); // String binding output.
if (status)
exit(status);
// Validates the format of the string binding handle and converts
// it to a binding handle.
// Connection is not done here either.
status = RpcBindingFromStringBinding(
szStringBinding, // The string binding to validate.
&hRPCProjectBinding); // Put the result in the implicit binding
// handle defined in the IDL file.
if (status)
exit(status);
RpcTryExcept
{
// Calls the RPC function. The hRPCProjectBinding binding handle
// is used implicitly.
// Connection is done here.
Output((unsigned char*)"Implcicit RPC Server Call from Client ");
system("PAUSE");
ShutDown();
}
RpcExcept(1)
{
std::cerr << "Runtime reported exception " << RpcExceptionCode()
<< std::endl;
}
RpcEndExcept
// Free the memory allocated by a string.
status = RpcStringFree(
&szStringBinding); // String to be freed.
if (status)
exit(status);
// Releases binding handle resources and disconnects from the server.
status = RpcBindingFree(
&hRPCProjectBinding); // Frees the implicit binding handle defined in
// the IDL file.
if (status)
exit(status);
}
这是我开发这个项目所遵循的教程:
非常感谢任何参考资料、输入或批评。
感谢您抽出宝贵时间阅读本文并提供任何指导。
假设您正在谈论 MS-RPC,最简单的方法是用 C++ 编写一个互操作 DLL 来进行 RPC 调用。让该 DLL 包含 midl.exe 的 *_c.c 和 *_h.h 输出,然后添加代码以设置绑定句柄等
这将需要在 C++ 代码中进行相当多的转换(从 .net 类型到可以通过网络传输的类型),但会立即花费最少的精力。
更极端的选择是将您的 RPC 代码重写为纯 .net,此时有大量可用的远程处理选项。
让我尝试简要解释一下我要在这里完成的工作...
我使用远程过程调用 (RPC) 方法用 C++ 开发了一个客户端应用程序,还用 C++ 开发了一个服务器应用程序。客户端是 64 位的,服务器是 32 位的。这项工作的目标是使用客户端将变量传递给服务器端的函数。然后服务器将使用 32 位 .dll 来处理接收到的数据,并将 return 输出值返回给客户端。这个过程运行良好,我对此非常满意。
我正在使用一个用 C# 开发的 64 位应用程序,它有一个静态 class 用于将变量发送到 .dll 并 return 输出值。因为此应用程序是 64 位的,所以它无法连接到这些计算所需的 32 位 .dll (duh)。
现在我的问题...
有什么方法可以保留我已经用 C++ 开发的进程并从 64 位 C# 项目访问 32 位服务器?有没有更好的方法来解决这一切?
编辑: 我还应该包括我正在使用 rpcrt4.lib,这是我的客户端示例代码。
int main()
{
RPC_STATUS status;
unsigned char* szStringBinding = NULL;
char temppath[MAX_PATH] = {0};
// Creates a string binding handle.
// This function is nothing more than a printf.
// Connection is not done here.
status = RpcStringBindingCompose(
NULL, // UUID to bind to.
reinterpret_cast<unsigned char*>("ncacn_ip_tcp"), // Use TCP/IP
// protocol.
reinterpret_cast<unsigned char*>("localhost"), // TCP/IP network
// address to use.
reinterpret_cast<unsigned char*>("4747"), // TCP/IP port to use.
NULL, // Protocol dependent network options to use.
&szStringBinding); // String binding output.
if (status)
exit(status);
// Validates the format of the string binding handle and converts
// it to a binding handle.
// Connection is not done here either.
status = RpcBindingFromStringBinding(
szStringBinding, // The string binding to validate.
&hRPCProjectBinding); // Put the result in the implicit binding
// handle defined in the IDL file.
if (status)
exit(status);
RpcTryExcept
{
// Calls the RPC function. The hRPCProjectBinding binding handle
// is used implicitly.
// Connection is done here.
Output((unsigned char*)"Implcicit RPC Server Call from Client ");
system("PAUSE");
ShutDown();
}
RpcExcept(1)
{
std::cerr << "Runtime reported exception " << RpcExceptionCode()
<< std::endl;
}
RpcEndExcept
// Free the memory allocated by a string.
status = RpcStringFree(
&szStringBinding); // String to be freed.
if (status)
exit(status);
// Releases binding handle resources and disconnects from the server.
status = RpcBindingFree(
&hRPCProjectBinding); // Frees the implicit binding handle defined in
// the IDL file.
if (status)
exit(status);
}
这是我开发这个项目所遵循的教程:
非常感谢任何参考资料、输入或批评。
感谢您抽出宝贵时间阅读本文并提供任何指导。
假设您正在谈论 MS-RPC,最简单的方法是用 C++ 编写一个互操作 DLL 来进行 RPC 调用。让该 DLL 包含 midl.exe 的 *_c.c 和 *_h.h 输出,然后添加代码以设置绑定句柄等
这将需要在 C++ 代码中进行相当多的转换(从 .net 类型到可以通过网络传输的类型),但会立即花费最少的精力。
更极端的选择是将您的 RPC 代码重写为纯 .net,此时有大量可用的远程处理选项。