无法加载C ++ / CLI DLL资源

时间:2013-02-26 10:54:54

标签: resources

我正在尝试查看资源名称,但没有出现。

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

我的简单代码:

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

我知道DLL已加载,因为当我调试时,我可以看到'asm'变量中的所有信息。我也可以从DLL导入数据(使用MEF)。

因此,DLL有资源和代码IS加载程序集肯定。但为什么我的'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的问题。您必须在“项目属性”中的“链接器”选项卡下的“输入”项中添加它。现在它似乎工作正常。感谢

1 个答案:

答案 0 :(得分: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。