0

我在 VS2010 中使用 .NET 2.0 类库(我们称之为类库 A),它是包含许多 .NET 2.0 类库(B、C ..)的解决方案的一部分。

类库 A 引用了 B。

应用程序通过加载 A 的程序集并将其清单中的内容添加到当前应用程序域中来使用类库 A。

它通过覆盖 AssemblyResolve 事件(在找不到程序集时触发)并通过从清单的 A 流中读取 B 来加载 B 的库来实现这一点。

这适用于像这样引用的所有其他类库。

由于某种原因,类库 B(尽管在 A 的清单中引用)没有嵌入到 A 的清单中

我有一个类库 C,其中包含对类库 B 的引用,并如上所述成功加载。

类库 A 和类库 C 都具有以下内容:

.assembly extern FluorineFx
{
  .ver 1:0:0:15
}

在 C 的清单中,有一个用于 lib B 的 .mresource,但在 lib A 的清单中却没有:

.mresource public ClassLibB.FluorineFx.dll
{
  // Offset: 0x00000000 Length: 0x000EC000
}

如何确保 B 嵌入在 A 的清单中(最好来自项目的 IDE)?

4

1 回答 1

0

事实证明,A 和 C 项目文件之间存在两个差异:

  1. 在 C 中,FluorineFx 引用库的项目组中有一段额外的 XML

    <Embed>true</Embed>

  2. 在 C 中,在项目中添加了一个 BeforeBuild 任务:

    <Target Name="BeforeBuild"> <CreateItem Include="@(ProjectReference->'%(RootDir)%(Directory)bin\$(Configuration)*.dll')" Condition="%(ProjectReference.Embed)== 'True'"> <Output TaskParameter="Include" ItemName="ProjectReferencesToInclude" /> </CreateItem> <Message Text="ProjectReferencesToInclude contains @(ProjectReferencesToInclude)" Importance="High" /> <ItemGroup> <EmbeddedResource Include=" @(ProjectReferencesToInclude)"> <LogicalName>ClassLibA.%(Filename).dll</LogicalName> </EmbeddedResource> </ItemGroup> <Message Text="EmbeddedResources 现在包含 @(EmbeddedResource)" Importance="High" /> < /目标>

当我对 A 进行这些更改时,它会使用清单中包含的 FluorineFx 进行构建。不仅如此,它还包括 FluorineFx 使用的库 - antlr 和 log4net!

于 2013-08-22T16:27:52.080 回答