2

我只是想查看资源名称,但什么也没有出现。

我在 Visual Studio 2010 中制作并编译了一个 C++/CLI(托管)DLL,并添加了一些资源文件作为测试(一个图标和一个位图)。我已经检查过 PE Explorer,资源肯定在那里。

我的简单代码:

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

我知道 DLL 已加载,因为当我调试时,我可以看到“asm”变量中的所有信息。我也可以从 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 的问题。您必须在项目属性的链接器选项卡下的输入项中添加它。现在它似乎工作正常。谢谢

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 回答