RPC_E_SERVERFAULT при вызове COM-объекта Visual FoxPro (вне процесса) из .Net? - PullRequest
2 голосов
/ 02 января 2012

Мне нужно вызвать COM-объект Foxpro (VFP 8) из C #

Код vfp выглядит так:

Define Class x2 As session OlePublic
    Function testInteropServer()
    ENDFUNC
Enddefine

Код C # выглядит следующим образом:

[TestFixture]
public class TestFixture
{
    [Test]
    public void TestXtmBase()
    {
        xtmbase.x2 xtmBaseX2 = new xtmbase.x2();
        xtmBaseX2.testInteropServer();
    }
}

COM-сервер скомпилирован как исполняемый файл (не dll). Я могу загрузить его из Фокса. Он загружает объект в .Net, но я не могу вызвать ни один из его методов. Я импортирую ссылку COM через GUI в VS 2005. Он распознает все методы и свойства объекта. Я просто не могу получить к ним доступ. Я получаю следующую ошибку:

Test 'TestProject/TestFixture/TestXtmBase' failed:
    Execute
    System.Runtime.InteropServices.COMException: The server threw an exception.
        (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))
    ErrorCode: -2147417851
    at xtmbase.x2Class.testInteropServer()

Чтобы исключить возможность его связывания с исполняемым файлом COM, я создал MT dll со следующим кодом:

Define Class MTx2 As session OlePublic
  Function testInteropServer()
  ENDFUNC
Enddefine

Затем я создал консольное приложение:

class Program
{
    static void Main(string[] args)
    {
        mtx2.mtx2 mtx2 = new mtx2.mtx2();
        mtx2.testInteropServer();
        Console.WriteLine("Done");
    }
}

и не получается:

System.Runtime.InteropServices.COMException was unhandled
Message="The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))"
Source="Interop.mtx2"
ErrorCode=-2147417851
StackTrace:
   at mtx2.mtx2Class.testInteropServer()
   at ConsoleTest.Program.Main(String[] args) in E:\development\iisx2\ConsoleTest\Program.cs:line 12
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Есть идеи почему?

Ответы [ 2 ]

1 голос
/ 02 января 2012

Вы ищете проблему в неправильном процессе. Это был COM-сервер, который упал на исключение. Ошибка RPC_E_SERVERFAULT - всего лишь уведомление об этом, довольно бесполезное, поскольку вся информация об исключении была потеряна.

Присоедините отладчик к процессу сервера перед запуском оператора и остановите его во всех исключениях, чтобы вы могли диагностировать это. В VS это делается с помощью Debug + Exceptions, отметьте поле «Thrown» для «Win32 Exceptions». Инструменты + Присоединить к процессу.

Обработка по умолчанию, конечно, невероятно бесполезна. Вы можете исправить это в Vista и выше с помощью интерфейса IGlobalOptions . Используйте COMGLB_EXCEPTION_HANDLING, чтобы вызвать сбой сервера. Это должно быть сделано в коде сервера, должно быть, это небольшая проблема в Foxpro, я думаю.

0 голосов
/ 03 января 2012

Это произошло из-за DEP (Data Execution Prevention) (спасибо pst), который, похоже, является проблемой с кодом Foxpro.

Вы можете вручную добавить свое приложение в список исключений DEP через графический интерфейс, но янужен программный способ сделать это так:

Добавьте exe-файл в список исключений, используя ключ реестра:
HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers
"fullPathToExe"= "DisableNXShowUI"

Если DEP активен, вы должны перезагрузиться, чтобы он заработал.

...