- - PR -
J#で作成したコンポーネントのC++ラッパーを作成したい。
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 | ||||||||
|
投稿日時: 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(); } | ||||||||
|
投稿日時: 2006-01-11 12:15
作成した C++ ラッパ クラスは、"別の" マネージドな C++ のプロジェクトからは実行できますか?
(どの時点の問題なのかを知りたいです) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-01-11 15:54
>作成した C++ ラッパ クラスは、"別の" マネージドな C++ のプロジェクトからは実行できますか?
>(どの時点の問題なのかを知りたいです) > やってみましたができませんでした。 同じエラー(vjslibが読めない)になります。 他に試してみることはありますでしょうか? ちなみにCppWrapperをdllではなくexeにして実行すると正常に動作します。 | ||||||||
|
投稿日時: 2006-01-12 16:22
じゃあ、C++ ラッパ クラスより上が原因ですね。
これは、C++ ラッパ ライブラリ自体を動作させるという意味ですよね? vjslib でない他のライブラリだと DLL 参照でもうまくいったりしませんか? # vjslib って色々と問題があるみたいですが... # vjslib だけを参照した状態でもダメっぽい。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1