在 C# 服务器进程中加载​​应用程序时引发 SEHException

Posted

技术标签:

【中文标题】在 C# 服务器进程中加载​​应用程序时引发 SEHException【英文标题】:SEHException thrown while loading an application in a C# Server Process 【发布时间】:2018-03-28 18:48:20 【问题描述】:

我有一个 .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。所以没有问题,在课堂上。

【问题讨论】:

请给我们一些代码。 嗨拉马尔,用代码更新了帖子 【参考方案1】:

对不起,我更新的主机进程在进行一些更改后没有放置到所需的位置。 我们可以结束这个问题。

【讨论】:

以上是关于在 C# 服务器进程中加载​​应用程序时引发 SEHException的主要内容,如果未能解决你的问题,请参考以下文章

在 Javascript 中加载 XML 数据时出错

在 C# 中加载和保存 ComboBox、NumericUpDown、HexUpDown 中的值

在 C# 中的自定义 appdomain 中加载 dll

从 CLI C++ 应用程序在库中加载 C# WPF 表单

C# 在 appdomain 调用方法中加载 dll,而不会再次加载 dll

无法在 c# 项目中加载 cvextern