|
分類:[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の作成部分が怪しいと思うのですが、
どこが間違っているのか分からないので打つ手なしです。
分かりづらくて申し訳ありませんが、何かお分かりの方、
いらっしゃいましたらご教授願えませんでしょうか。
宜しくお願い致します。
|