2

リソース名だけを見ようとしていますが、何も表示されません。

Visual Studio 2010 で C++/CLI (マネージ) DLL を作成してコンパイルし、テストとしていくつかのリソース ファイルを追加しました (1 つのアイコンと 1 つのビットマップ)。PE Explorer で確認したところ、リソースは確実に存在します。

私の簡単なコード:

Assembly asm = Assembly.LoadFrom("C:\\test.dll");
String[] res = asm.GetManifestResourceNames();

デバッグ時に「asm」変数のすべての情報を確認できるため、DLL がロードされていることがわかります。また、DLL から (MEF を使用して) データをインポートすることもできます。

したがって、DLL にはリソースがあり、コードは確実にアセンブリをロードしています。しかし、'res' 変数が常に空の文字列リストを返すのはなぜですか?

編集: テスト用のリソースを含む C# クラス ライブラリ (.dll) を作成しました。今それは動作します!! しかし、私の C++/CLI DLL にはまだリソースが表示されません。どういうわけかそれらは DLL にありますが、コードはそれに到達できません (C++ DLL のみ)。マネージ/アンマネージ コードと関係があるかもしれませんが、CLR でコンパイルしているので、そうではないようです。助言がありますか?

解決策 わかり ました!誰かが必要な場合に備えて。

これらのトピックによると:

C++/CLI プロジェクトへのリソースの埋め込み

http://bytes.com/topic/net/answers/571530-loading-markup-xamlreader-load-resource-file#post2240705

問題はまさに C++/CLI の問題です。Project Properties の Linker タブの Input 項目に追加する必要があります。今ではうまくいくようです。ありがとう

4

1 に答える 1

1

私は同様の問題を抱えており、あなたの質問はそれを解決するのに役立ちます。私のプロジェクト プラットフォームは C++/CLI で、DLL プラットフォームは c# です。

DLL を実行ファイルにパックしたいので、最初に以下の手順で DLL をプロジェクト リソース ファイルに配置する必要があります。

1. DLL をプロジェクト パスにコピーします。

2.以下に DLL 名 (test.dll など) を配置します。プロパティ -> リンカー -> 入力 -> 埋め込みマネージド リソース ファイル

次に、組み込み DLL を読み取って使用する必要があります。

Stream^ stream = Assembly::GetExecutingAssembly()->GetManifestResourceStream("test.dll");

array<unsigned char>^ dllRawBuffer = gcnew array<unsigned char>(stream->Length);

int res = stream->Read(dllRawBuffer, 0, stream->Length);
stream->Close();

Assembly^ dllAssembly = Assembly::Load(dllRawBuffer);

System::Type^ testclass = dllAssembly->GetType("TestNamespace.TestClass");

MethodInfo^ TestMethod = testclass->GetMethod("TestMethodName");

// Create an instance.
Object^ Testobj = Activator::CreateInstance(testclass);


// Execute the method.

array<Object^>^ params = gcnew array<Object^>(2);
params[0] = 2;
params[1] = 3;

Object^ result = TestMethod->Invoke(Testobj, params);

明らかに、このソリューションはマネージ DLL に対してのみ機能します。

于 2020-08-20T08:58:14.777 に答える