Исключение SEHException при загрузке приложения в процессе сервера C#
У меня есть клиент.NET, который имеет несколько файлов библиотеки C#, один из файлов библиотеки C# загружает стороннюю собственную библиотеку. Теперь по некоторым причинам мы хотели бы преобразовать библиотеку C# в новый серверный процесс C#, который, в свою очередь, будет размещать стороннюю собственную библиотеку и использовать ее. Я использовал.NET Remoting Framework(HttpServerChannel) для достижения этой цели. Чтобы иметь возможность использовать API-интерфейсы нативной библиотеки, мне сначала нужно загрузить некоторые из ее внутренних модулей и приложений. При загрузке приложений я получаю исключение SEH. Примечание. Это прекрасно работает с существующей архитектурой, в которой библиотека C# выполняет эту работу вместо процесса C#. Вызов выглядит примерно так (API используется в Teigha Service) SystemObjects.DynamicLinker.LoadApp("GripPoints", true, true)
Заранее извиняюсь, если я что-то пропустил, поскольку я новичок в.NET REMOTING Framework.
Запись обновлена с использованием приведенного ниже кода. Библиотека 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)
Приведенный выше API прекрасно работает, если мы напрямую загружаем библиотеку C# из нашего клиента библиотеки C#, и он не работает, когда процесс C# Server размещает библиотеку C#.
Примечание. Класс в "MyClassInternal" уже наследуется от MarshalByRefObject. Так что никаких проблем в классе.
1 ответ
Извините, ребята, мой обновленный хост-процесс не был помещен в нужное место после внесения некоторых изменений. Мы можем закрыть этот вопрос.