- PR -

J#で作成したコンポーネントのC++ラッパーを作成したい。

1
投稿者投稿内容
hiro-ta
ベテラン
会議室デビュー日: 2003/09/03
投稿数: 79
投稿日時: 2006-01-10 18:44
いつもお世話になっております。

J#で.NETコンポーネントを作成してそれをアンマネージなC++mainから呼べるようにしようとしています。

私が考えたのは
1.J#でコンポーネント作成
2. C++マネージ拡張で1.のC++ラッパーライブラリを作成
3. C++クライアントから2.を呼び出す。
というもので
以下のようなサンプルプログラムを作ってみましたが実行時にvjslibが見つからないというエラーになりうまくいきません。(GACにvjs.libは入っている)
いろいろ試してみましたがこれ以上先に進めません。
どなたか、なにかヒントでも結構ですので助言等いただけないでしょうか?

[J#で作成したコンポーネント JSComp.dll]
package JSComp;

/**
* Class1 の概要の説明です。
*/
public class Class1
{
public Class1()
{
System.out.println("JSComp Constructor");
}
public void outText(String strOut)
{
System.out.println(strOut);
}
}

[C++ラッパー C++マネージ拡張で作成 CppWrapper.dll]
#include "stdafx.h"

#using < mscorlib.dll >
#using "JSComp.dll"
#include < vcclr.h >
#include "CppWrapper.h"

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma managed
CppWrapper::CppWrapper()
{
Console::WriteLine("CppWrapper Constructor");
}

void CppWrapper::PrintString()
{
Console::WriteLine(S"CppWrapper::PrintString");
JSComp::Class1* cls1 = new JSComp::Class1;
}


[C++クライアント cwtest.exe]
#include "stdafx.h"
#include "../CppWrapper/CppWrapper.h"

int main(int argc, char* argv[])
{
printf("cwtest main\n");
CppWrapper cw;
cw.PrintString();
return 0;
}

以上のプログラムでコンパイル、リンクは通ります。
cwtest.exeを実行すると以下のエラーになります。

>cwtest.exe
cwtest main
CppWrapper Constructor
CppWrapper::PrintString

ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセン
ブリ 'vjslib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかり
ません。
ファイル名 'vjslib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d
50a3a' です。 ---> System.IO.FileNotFoundException: ファイルまたはアセンブリ 'vj
slib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、ま
たはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりませ
ん。
ファイル名 'vjslib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f
11d50a3a' です。

警告: アセンブリ バインドのログ記録がオフにされています。
アセンブリ バインドのエラー ログを有効にするには、レジストリ値 [HKLM\Software\Mi
crosoft\Fusion!EnableLog] (DWORD) を 1 に設定してください。
注意: アセンブリ バインドのエラー ログに関連するパフォーマンス ペナルティがあり
ます。
この機能をオフにするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog
] を削除します。

場所 JSComp.Class1..ctor()
場所 CppWrapper.PrintString(CppWrapper* ) 場所 c:\programs\workings\excelgent
est\cppwrapper\cppwrapper.cpp:行 25

hiro-ta
ベテラン
会議室デビュー日: 2003/09/03
投稿数: 79
投稿日時: 2006-01-11 12:10
その後、C++マネージ拡張を使う方法はあきらめてregasmでCOMラッパーを作りそれをC++から利用する方法をやってみましたが、これもRuntimeError!が発生してうまくいきません。
C#なら動作するのですがJ#だとダメです。
何かお気づきの方いらっしゃれば教えてください。

1. COM登録
> regasm /tlb JSComp.dll

2. GAC登録
> gacutil -i JSComp.dll

3. C++クライアントをコンパイルして実行 → RuntimeError!

[J# コンポーネント JSComp.dll]
public interface ILoan
{
void outText();
}

public class Loan implements ILoan
{
public Loan()
{
System.out.println("JSComp Constructor");
}

public void outText()
{
System.out.println("outText!!");
}
}

[C++クライアント]

#include "stdafx.h"
#import "../Release/JSComp.tlb" named_guids raw_interfaces_only
using namespace JSComp;

int main(int argc, char* argv[])
{
HRESULT hr = CoInitialize(NULL);
ILoanPtr pILoan(__uuidof(Loan));
CoUninitialize();
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-11 12:15
作成した C++ ラッパ クラスは、"別の" マネージドな C++ のプロジェクトからは実行できますか?
(どの時点の問題なのかを知りたいです)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
hiro-ta
ベテラン
会議室デビュー日: 2003/09/03
投稿数: 79
投稿日時: 2006-01-11 15:54
>作成した C++ ラッパ クラスは、"別の" マネージドな C++ のプロジェクトからは実行できますか?
>(どの時点の問題なのかを知りたいです)
>
やってみましたができませんでした。
同じエラー(vjslibが読めない)になります。

他に試してみることはありますでしょうか?
ちなみにCppWrapperをdllではなくexeにして実行すると正常に動作します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-12 16:22
引用:

hiro-taさんの書き込み (2006-01-11 15:54) より:

やってみましたができませんでした。
同じエラー(vjslibが読めない)になります。


じゃあ、C++ ラッパ クラスより上が原因ですね。

引用:

他に試してみることはありますでしょうか?
ちなみにCppWrapperをdllではなくexeにして実行すると正常に動作します。


これは、C++ ラッパ ライブラリ自体を動作させるという意味ですよね?
vjslib でない他のライブラリだと DLL 参照でもうまくいったりしませんか?

# vjslib って色々と問題があるみたいですが...
# vjslib だけを参照した状態でもダメっぽい。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)