我有一个 .NET 客户端,它有几个 C# 库文件,其中一个 C# 库文件加载第三方本机库。现在由于某些原因,我们希望将 C# 库转换为新的 C# 服务器进程,该进程将反过来托管第三方本机库并使用它。我已经使用 .NET Remoting 框架(HttpServerChannel)来实现这一点。为了能够使用本机库 API,我首先需要加载它的一些内部模块和应用程序。加载应用程序时出现 SEH 异常。注意:这适用于我有 C# 库而不是 C# 进程的现有体系结构。调用如下(API 用于 Teigha 服务) SystemObjects.DynamicLinker.LoadApp("GripPoints", true, true)
如果由于我是 .NET REMOTING 框架的新手而遗漏了任何内容,请提前道歉。
使用以下代码发布更新 - 已引用加载本机库的 C# 库来创建新的服务器进程。服务器代码如下。引用的 C# 库是“MyClassInternal”
`using MyClassInternal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DWGServerHost
{
class DWGServerHostMain
{
public static int serverPort = 9876;
static void Main(string[] args)
{
HttpServerChannel http = null;
if (args.Length > 0 && !int.TryParse(args[0], out serverPort))
{
serverPort = 9876;
}
http = new HttpServerChannel(serverPort);
ChannelServices.RegisterChannel(http, false);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(MyClass),
"MyClassService",
WellKnownObjectMode.SingleCall);
Thread.CurrentThread.Join();
}
}
}`
在客户端启动此服务,然后按如下方式使用 -
Process proc = new Process();
proc.StartInfo.FileName = Path.Combine("Path to Exe", "DWGServerHost.exe");
proc.StartInfo.Arguments = "9876";
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.WorkingDirectory = "Path to Server Location";
proc.Start();
//SetErrorMode(0);
if (proc.HasExited)
{
Console.WriteLine("Could not start server");
return -1;
}
HttpClientChannel http = null;
http = new HttpClientChannel();
ChannelServices.RegisterChannel(http, false);
assembly = Assembly.LoadFrom("Path to DLL");
Object obj = Activator.GetObject(typeof(MyClass), "http://localhost:9876/MyClassService");
MyClass myClass = (MyClass)obj;
反过来,“MyClassInternal”库加载第三方库并创建服务。为了使用第三方库 API,必须进行一些初始化,例如加载第三方库的内部库和模块。使用的 API 是 -
SystemObjects.DynamicLinker.LoadApp("GripPoints", true, true)
如果我们直接从我们的 C# 库客户端加载 C# 库,则上述 API 可以完美运行,而当托管 C# 库的 C# Server 进程时它不起作用。
注意:“MyClassInternal”中的类已经继承自 MarshalByRefObject。所以没有问题,在课堂上。