我试图在我的控制台项目中嵌入一个非托管的dll。项目的默认名称空间为Company.Project1Exe
。程序集名称(输出exe)名为project1.exe
使用Add as Link
选项将dll添加到项目中,并位于Libs\x86
子文件夹
Company.Project1Exe
|
|--Program.cs
|--Libs
|--x86
|-My1st.dll
|-My2nd.dll
它们已使用Add as Link
选项添加到项目中,因此未实际位于Libs
子文件夹中。
我已将这两个dll的Build Action设置为'Embedded Resource'。
默认情况下,MSBuild将使用DefaultNamspace.ExtendedNamespace.FileName
嵌入这些dll,其中ExtendedNamespace
表示项目的目录结构。
这会导致资源分别嵌入Company.Project1.Libs.x86.My1st.dll
和Company.Project1.Libs.x86.My2nd.dll
。
我希望使用程序集名称嵌入这些资源,以便它们分别嵌入Project1.Libs.x86.My1st.dll
和Project1.Libs.x86.My2nd.dll
。
我该怎么做?
答案 0 :(得分:12)
可以解决此问题的一种方法是设置嵌入资源的LogicalName
。默认情况下,当您嵌入资源时,您会在csproj文件中找到类似于
<EmbeddedResource Include="path to embdedded resource"/>
对于使用Add as Link
添加的资源,您会发现其他Link
属性。在这种情况下,Link
属性是资源相对于项目结构的路径,Include
属性是指向文件在计算机上的位置(相对于项目)。
<EmbeddedResource Include="path to embdedded resource"/>
<Link>Libs\x86\My1st.dll</Link>
</EmbeddedResource>
为了使用不同的命名空间嵌入程序集,可以将LogicalName
属性添加到上面,允许用户覆盖默认的msbuild行为。
<EmbeddedResource Include="path to embdedded resource"/>
<Link>Libs\x86\My1st.dll</Link>
<LogicalName>$(TargetName).Libs.x86.My1st.dll</LogicalName>
</EmbeddedResource>
它看起来的缺点是,每个添加的资源都需要这样做。但是,我希望以某种方式设置此约定,以便这可以是在我的项目中嵌入任何资源的默认方式,即使用$(TargetName)
替换默认命名空间