C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: JNI でのJavaからC#の呼び出し


(過去ログ 92 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■54715 / inTopicNo.1)  JNI でのJavaからC#の呼び出し
  
□投稿者/ nonstop820 (1回)-(2010/10/29(Fri) 19:07:28)

分類:[C#] 

お世話になります。

前任者がやったものを引き継いで、
JNIでJavaからC++を経由してC#のプログラムを呼び出そうとしています。
バージョンは以下の通りです。

Java	: JDK1.4.2_12
C++	: .Net Framework 4.0
C#	: .Net Framework 2.0


C# を Visual Studio で単体デバッグ実行すると問題なく動くのですが、
いざ実行環境にのせてみると、C#でエラーが発生してしまいます。
引継ぎ資料に書いてある方法でビルドや環境設定を行ってもうまくいかず、
昨日一日中かけて自分でも色々と調べてやってみましたがダメでした。
C++は全くの初心者でC#は少し触ったことがある程度、
JNIを使うのも初めてなので、お手上げ状態です・・・。

C# の csファイルをnetmoduleとしてコンパイルし、C++のdllからそれを読み込んでいます。
Java から C++ のメソッドをコールし、C++ が C# のクラスのコンストラクタを呼び出す部分まではいくのですが、
いざメソッドを呼び出すところでエラーが発生します。
このコードではログを出すためにコンストラクタで呼び出していますが、
実際には C++ がこのメソッドを呼び出すところで発生しています。
(その直前まで C++ のログが出力されています)

C# のコード:
************************************************************************************************
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Text;
using ExchangeSubscriber.EWSReference;
using System.Net;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Xml.Serialization;
using Npgsql;

class PushNotificationSubscriber
{
    public PushNotificationSubscriber()
    {
        System.Console.WriteLine("PushNotificationSubscriber() is called !");

        try
        {
            this.SubscribeForPushNotifications("192.168.1.1", "domein.local", "", "user",
                "http://192.168.1.2:8888/IIS/Path/app.axmx",
                "DB接続文字列");
        }
        catch (Exception e)
        {
            System.Console.WriteLine(e.Message);
            System.Console.WriteLine(e.Source);
            System.Console.WriteLine(e.StackTrace);
            //System.Console.WriteLine(e.ToString);
        }
    }

    public void SubscribeForPushNotifications(string server, string domain, string watermark, string impUser, string endpoint, string pgsqlurl)
    {
        System.Console.WriteLine("SubscribeForPushNotifications is called !");

        System.Net.ServicePointManager.ServerCertificateValidationCallback =
        delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            // Replace this line with code to validate server certificate.
            return true;
        };
------------------------以下略--------------------------------------

************************************************************************************************

C++ のコード:
************************************************************************************************
#using <mscorlib.dll>
#using "PushNotificationSubscriber.netmodule"
using namespace System;

// This code wraps the C# class using Managed C++
public __gc class PushNotificationSubscriberC
{
	
public:
	PushNotificationSubscriber __gc *t; // Provide .NET interop and garbage collecting to the pointer.
	
	PushNotificationSubscriberC() {		
		t = new PushNotificationSubscriber(); // Assign the reference a new instance of the constructor.				
	}

	
	void callPushNotificationSubscriber(char *server, char *domain, char *wm, char *user, char *ep, char *purl)  {
			
		Console::WriteLine("c++ start");

		Console::WriteLine(server);
		Console::WriteLine(domain);
		Console::WriteLine(wm);
		Console::WriteLine(user);
		Console::WriteLine(ep);
		Console::WriteLine(purl); ←ここまでコンソールに出力されています

		t->SubscribeForPushNotifications(server, domain, wm, user, ep, purl); ←ココでエラー発生
		
		Console::WriteLine("c++ end");
	}
};
************************************************************************************************

ログ(発生するエラーと前後の出力):
************************************************************************************************

PushNotificationSubscriber() is called !
ファイルまたはアセンブリ 'Web References.EWSReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'、
またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
PushNotificationSubscriber
   場所 PushNotificationSubscriber.SubscribeForPushNotifications(String server, String domain, String watermark, String impUser, String endpoint, String pgsqlurl)
   場所 PushNotificationSubscriber..ctor()
c++ start

・・・
・・・
・・・
・・・
・・・
・・・

#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
#  Internal Error (0xe0434352), pid=16368, tid=15516
#
# Java VM: Java HotSpot(TM) Client VM (1.4.2_12-b03 mixed mode)
# Problematic frame:
# C  [kernel32.dll+0xbef7]
#
# An error report file with more information is saved as hs_err_pid16368.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

************************************************************************************************

netmodule 作成コマンド:
************************************************************************************************
csc.exe /debug /r:C:\Npgsql2.0.7-bin-ms.net\Npgsql2.0.7-bin-ms.net\bin\NPgsql.dll
 /r:"C:\native\PushNotification\PushNotificationSubscriber\obj\Debug\TempPE\Web References.EWSReference.Reference.cs.dll"
 /t:module PushNotificationSubscriber.cs
************************************************************************************************

フォルダ構成:
************************************************************************************************
プロジェクトルート
 L PushNotificationSubscriber.cs
 L Web References
     L EWSReference
         L ....
         L ....
         L ....
 L obj
     L Debug
         L TempPE
             L Web References.EWSReference.Reference.cs.dll

※実行環境では Java のクラスパス内にC++のdllとnetmoduleを置いています。
************************************************************************************************


個人的には、netmoduleの作成部分が怪しいと思うのですが、
どこが間違っているのか分からないので打つ手なしです。
分かりづらくて申し訳ありませんが、何かお分かりの方、
いらっしゃいましたらご教授願えませんでしょうか。
宜しくお願い致します。

引用返信 編集キー/
■54719 / inTopicNo.2)  Re[1]: JNI でのJavaからC#の呼び出し
□投稿者/ Azulean (632回)-(2010/10/29(Fri) 23:22:29)
例外のメッセージ通り、Web References.EWSReference.Reference.cs.dll が見つかるパスに置かれていないだけでは?
netmodule とお呼びになっている dll と同じフォルダに置いてみてはいかがでしょうか?

すでに置いているのであれば、もう少し配置状況を具体的に説明してください。


# /r オプションは参照なので、基本的にその参照した DLL が必要です。埋め込む訳じゃありません。
引用返信 編集キー/
■54791 / inTopicNo.3)  Re[2]: JNI でのJavaからC#の呼び出し
□投稿者/ nonstop820 (2回)-(2010/11/02(Tue) 13:15:55)
Azuleanさん、ありがとうございます。

Web References.EWSReference.Reference.cs.dll を
netmoduleと同じフォルダに置いてみても結果は変わらなかったのですが、
netmodule作成時のコマンドで Web References.EWSReference.Reference.cs を一緒にコンパイルしてみたところ、
このエラーは出なくなりました。
今度は別のエラーが出てしまっているのですが、そちらはもう少し自分で調べたいと思います。

どうもありがとうございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -