11

我试图在我的控制台项目中嵌入一个非托管 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 的构建操作设置为“嵌入式资源”。

默认情况下,MSBuild 将使用代表项目目录结构的DefaultNamspace.ExtendedNamespace.FileNamewhere嵌入这些 dll。ExtendedNamespace

这导致资源被分别嵌入Company.Project1.Libs.x86.My1st.dll和嵌入Company.Project1.Libs.x86.My2nd.dll

我希望使用程序集名称嵌入这些资源,以便它们分别嵌入Project1.Libs.x86.My1st.dll和嵌入Project1.Libs.x86.My2nd.dll

我怎样才能做到这一点?

4

1 回答 1

17

可以解决此问题的一种方法是设置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)作为默认命名空间的替代品

于 2012-05-23T06:09:38.413 回答