2016-09-23 7 views
0

埋め込まれたMonoを使用して、C#から非常に単純なC関数を実行しようとしています。DllImport __正しい関数の設定にもかかわらず、内部関数が働いていません

これは(グローバルスコープで)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; 
    } 
} 

は、問題を解決します。

グローバル名前空間の関数を静的にすると、外部コンパイル単位にアクセスできなくなるため、C#にもアクセスできなくなります(C#アクセスには影響しないと誤って想定していたためです)。
ここでは少し複雑になるので、自分自身に知らせたい場合は、まずコンパイル単位についてお読みください。

名前空間に関係なく静的関数にアクセスする必要がある場合は、official mono exampleに示すように、「内部呼び出し」アプローチをお勧めします。それには他にも多くの利点があります。

関連する問題