6

Java アプリケーション内で C# 関数を使用しようと何時間も費やしましたが、成功しませんでした... C# で次のライブラリを作成しました。

public class Converter
{

    public Converter()
    {
    }

    public bool ConvertHtmlToPdf(String directoryPath)
    {
        //DO SOMETHING
    }
}

このdllは別のdllを呼び出していくつかの操作を行いますが、コンパイルするとRealseフォルダーにDLLが見つかり、すべて問題ないように見えるため、32ビットオプション、64ビット、および任意のCPUオプションを使用してコンパイルし、そうでないことを確認しました私の問題。

32 ビットのDependency Walkerと任意の CPU オプションを使用して dll ファイルを分析すると、IESHIMS.DLL が見つからないと表示され、次のメッセージが表示されます。

警告: 少なくとも 1 つの遅延読み込み依存モジュールが見つかりませんでした。警告: 遅延ロード依存モジュールにエクスポート機能がないため、少なくとも 1 つのモジュールに未解決のインポートがあります。

64 ビット ファイルでは発生しませんが、ConvertHtmlToPdf 関数が見つかりません。

関連性があるかどうかわからないので、私の 2 番目のステップは Java コードでした。

ライブラリをロードするには、次のようにします。

System.setProperty("jna.library.path", "C:\\Program Files (x86)\\Facilit\\Target App\\lib");

と:

public interface IConversorLibrary extends Library {

    IConversorLibrary INSTANCE = (IConversorLibrary) Native.loadLibrary("converter", IConversorLibrary.class);

    void ConvertHtmlToPdf(String directoryPath);
}

(lib は正常にロードされたようです。実行中のアプリケーションで dll ファイルを削除しようとすると、使用中のため削除できないと表示されます)そして最後に:

IConversorLibrary.INSTANCE.ConvertHtmlToPdf(directoryPath);

しかし、結果は私が望むものではありません:

java.lang.UnsatisfiedLinkError: Error looking up function 'ConvertHtmlToPdf': Could not find the specified procedure.

何が間違っているのかわかりません。多くのチュートリアルや多くのことを試しましたが、何でもうまくいくようです。どんな助けも本当に感謝しています。

4

2 に答える 2

3

テクノメイジが言ったように:

JNA は、C リンケージを使用する DLL からロードできます。AC# クラスは、デフォルトでは、いかなる種類の C リンケージもサポートしていません。C++ は、extern "C" 表記による C リンケージをサポートします。

この記事では、C# DLL のメソッドを C スタイルの DLL のように呼び出し可能にする方法を示しますが、残念ながらこれは非常に複雑です。

于 2013-10-09T13:36:44.550 に答える
3

このナゲットは非常に使いやすく、完璧に機能します。https://www.nuget.org/packages/UnmanagedExports

Visual Studio 2012 (高速) が必要です。インストールしたら、 [RGiesecke.DllExport.DllExport]エクスポートする静的関数の前に追加するだけです。それでおしまい!

例:

C#

[RGiesecke.DllExport.DllExport]
public static int YourFunction(string data)
{
     /*Your code here*/
     return 1;
}

ジャワ

上部にインポートを追加します。

   import com.sun.jna.Native;

クラスにインターフェイスを追加します。その C# 関数名の前に文字「I」を付けます。

  public interface IYourFunction extends com.sun.jna.Library
    {
       public int YourFunction(String tStr);
    };

クラス内の必要な場所で DLL を呼び出します。

IYourFunction iYourFunction = (IYourFunction )Native.loadLibrary("full or relative path to DLL withouth the .dll extention", IYourFunction.class);//call JNA
        System.out.println("Returned: " + IYourFunction.YourFunction("some parameter"));
于 2013-10-11T13:11:56.573 に答える