2016-09-23 3 views
0

Используя встроенный Mono, я пытаюсь выполнить очень простую функцию C изнутри C#.DllImport __Internal не работает, несмотря на правильную настройку функции

Это функция в C++ код (в глобальном масштабе):

extern "C" 
{ 
    static int __attribute__((noinline)) dllImportTest() 
    { 
     return 66; 
    } 
} 

Это C# код:

[DllImport("__Internal", EntryPoint="dllImportTest")] 
public static extern int dllImportTest(); 

public void testCFunctions() 
{ 
    int dllImport = dllImportTest(); 
    System.Console.Write("Got dllImport: " + dllImport + "\n"); 
} 

И это ошибка, я получаю:

System.EntryPointNotFoundException: dllImportTest 
    at (wrapper managed-to-native) MonoGlue.ATestClass:dllImportTest() 
    at MonoGlue.ATestClass.testCFunctions() [0x0000a] in <9effaf2265b34fbcb9a10abd58c42ed7>:0 

Я рассматривал примеры и подобные проблемы, но я не вижу, что происходит не так. Чтобы убедиться, что функция C не оптимизирована, я выполняю ее в коде на C++.
Я даже предотвращаю инкрустировать, как вы можете видеть.

Однако все еще не повезло. Мне все еще должно быть что-то, что мне не хватает.

+0

похоже, что сама dll не найдена. Обеспечили ли вы, что dll можно найти по вашему приложению? https://msdn.microsoft.com/en-us/library/system.entrypointnotfoundexception%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 – Mat

+0

«__Internal» означает, что это не внешняя DLL, а вложение среды C# :) – TheSHEEEP

+0

http://stackoverflow.com/questions/15643549/why-dllimport-doesnt-work-with-internal – Mat

ответ

1

Оказывается, функция dllImportTest не отображается в исполняемом файле из-за статичности. По общему признанию, статическая функция в глобальном пространстве имен практически не имеет смысла в большинстве ситуаций.

Так вместо этого:

extern "C" 
{ 
    static int __attribute__((noinline)) dllImportTest() 
    { 
     return 66; 
    } 
} 

С этим:

extern "C" 
{ 
    int __attribute__((noinline)) dllImportTest() 
    { 
     return 66; 
    } 
} 

Решает проблему.

Причина в том, что, создавая функцию в глобальном пространстве имен static, она становится недоступной для внешних единиц компиляции, что делает ее недоступной для C# (я неправильно предположил, что это не повлияет на доступ C#).
Здесь все усложняется, поэтому, если вы хотите сообщить себе, прочитайте и прочитайте о единицах компиляции.

Если вам требуется доступ к статической функции (независимо от того, в каком пространстве имен), я рекомендую подход «Внутренний вызов», как показано на странице official mono example. У этого есть много других преимуществ, также.

 Смежные вопросы

  • Нет связанных вопросов^_^