问题
I have a custom Task that I want to execute when building my C# projects. This task is located in MyTask.dll, which references another assembly, MyCommon.DLL.
The problem is that MyCommon.dll is located at "..\Common\MyCommon.dll" relative to MyTask.dll, which puts it outside the AppBase dir for MSBuild process. I've confirmed that this is indeed the problem by analyzing MSBuild's log and seeing Fusion's report about the binding failure.
What can I do to make Fusion find MyCommon.dll during the build process? Note that moving the assembly would break my app, which also depends on it.
UPDATE: Well, it seems I'll go with using a copy afterall. Other solutions all require system-wide modifications, which isn't really warranted here.
回答1:
So copy it instead? Just a thought. Have a copy there just to support the build that you delete once you're done with it.
回答2:
I see multiple solutions :
1st : Add the assembly in the GAC (your assembly must have a strong name)
gacutil /I <assembly name>
2nd : Locate the assembly through Codebases or Probing, in your machine.config file or in msbuild.exe.config
.
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="MyCommon"
publicKeyToken="32ab4ba45e0a69a1"
culture="neutral" />
<codeBase version="2.0.0.0"
href="file://C:/yourpath/MyCommon.DLL"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
3rd : copy the assembly in the same directory before and delete it after, like David M said.
回答3:
An option is to use ILMerge to merge the dependency into the task assembly.
回答4:
All of these "solutions" create more dependencies which complicate the environment. There should be an easier way to update the probing path at runtime..
Specifically MSBuild should allow you to add probing paths in your .proj file, or to specify the dependant dlls
You can define a custom UsingTask:
<UsingTask TaskName="Task" AssemblyFile="Assembly.dll" />
but you cant add dependencies? it should be included... here with something like
<UsingTask TaskName="Task" AssemblyFile="Assembly.dll">
<DependantAssembly AssemblyFile="dependant.dll"/>
</UsingTask>
But, no this isn't supported...
来源:https://stackoverflow.com/questions/690432/how-to-solve-custom-msbuild-task-requires-assembly-outside-of-appbase