我正在尝试查看资源名称,但没有出现。
我在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的问题。您必须在“项目属性”中的“链接器”选项卡下的“输入”项中添加它。现在它似乎工作正常。感谢
答案 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。