Skip to content
This repository was archived by the owner on Jul 13, 2026. It is now read-only.

Commit ac9ea09

Browse files
authored
Revert IBuildEngine.ProjectFileOfTaskNode use. (#201)
Reverts: 47f95ab Reverts: 76c076f Context: dotnet/android#7685 (comment) The problem is that we misunderstood [`IBuildEngine.ProjectFileOfTaskNode`][0]: we *thought* (hoped?) that it would return `$(MSBuildProjectFullPath)`, the path to the `.csproj` being built. In actuality it returns `$(MSBuildThisFileFullPath)` for the file containing the Task invocation. Meaning if e.g. `Xamarin.Android.Common.targets` contains the Task invocation, then IBuildEngine.ProjectFileOfTaskNode` would be the path to `Xamarin.Android.Common.targets`, *not* the path of the `.csproj`. This in turn means it doesn't actually solve the problem we had. We will instead need to audit all use of `IBuildEngine4.RegisterTaskObject()` & related to ensure that the keys provided *also* contain paths to project-specific files, if necessary. Revert 47f95ab and 76c076f, as the changes are not needed. [0]: https://learn.microsoft.com/en-us/dotnet/api/microsoft.build.framework.ibuildengine.projectfileoftasknode?view=msbuild-17-netcore
1 parent 47f95ab commit ac9ea09

1 file changed

Lines changed: 6 additions & 59 deletions

File tree

‎src/Microsoft.Android.Build.BaseTasks/MSBuildExtensions.cs‎

Lines changed: 6 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@
1313

1414
namespaceMicrosoft.Android.Build.Tasks
1515
{
16-
[Flags]
17-
publicenumRegisterTaskObjectKeyFlags{
18-
None=0,
19-
IncludeProjectFile=1<<0,
20-
}
21-
2216
publicstaticclassMSBuildExtensions
2317
{
2418
publicstaticvoidLogDebugMessage(thisTaskLoggingHelperlog,stringmessage,paramsobject[]messageArgs)
@@ -259,80 +253,33 @@ public static void SetDestinationSubPath (this ITaskItem assembly)
259253
/// IBuildEngine4.RegisterTaskObject, but adds the current assembly path into the key
260254
/// </summary>
261255
publicstaticvoidRegisterTaskObjectAssemblyLocal(thisIBuildEngine4engine,objectkey,objectvalue,RegisteredTaskObjectLifetimelifetime,boolallowEarlyCollection=false)=>
262-
RegisterTaskObjectAssemblyLocal(engine,key,value,lifetime,allowEarlyCollection:false,flags:RegisterTaskObjectKeyFlags.IncludeProjectFile);
263-
264-
/// <summary>
265-
/// IBuildEngine4.RegisterTaskObject, but adds the current assembly path into the key
266-
/// </summary>
267-
publicstaticvoidRegisterTaskObjectAssemblyLocal(thisIBuildEngine4engine,objectkey,objectvalue,RegisteredTaskObjectLifetimelifetime,RegisterTaskObjectKeyFlagsflags)=>
268-
engine.RegisterTaskObject(engine.GetKey(AssemblyLocation,key,flags),value,lifetime,allowEarlyCollection:false);
269-
270-
/// <summary>
271-
/// IBuildEngine4.RegisterTaskObject, but adds the current assembly path into the key
272-
/// </summary>
273-
publicstaticvoidRegisterTaskObjectAssemblyLocal(thisIBuildEngine4engine,objectkey,objectvalue,RegisteredTaskObjectLifetimelifetime,boolallowEarlyCollection,RegisterTaskObjectKeyFlagsflags)=>
274-
engine.RegisterTaskObject(engine.GetKey(AssemblyLocation,key,flags),value,lifetime,allowEarlyCollection);
256+
engine.RegisterTaskObject((AssemblyLocation,key),value,lifetime,allowEarlyCollection);
275257

276258
/// <summary>
277259
/// IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
278260
/// </summary>
279261
publicstaticobjectGetRegisteredTaskObjectAssemblyLocal(thisIBuildEngine4engine,objectkey,RegisteredTaskObjectLifetimelifetime)=>
280-
GetRegisteredTaskObjectAssemblyLocal(engine,key,lifetime,flags:RegisterTaskObjectKeyFlags.IncludeProjectFile);
281-
282-
/// <summary>
283-
/// IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
284-
/// </summary>
285-
publicstaticobjectGetRegisteredTaskObjectAssemblyLocal(thisIBuildEngine4engine,objectkey,RegisteredTaskObjectLifetimelifetime,RegisterTaskObjectKeyFlagsflags)=>
286-
engine.GetRegisteredTaskObject(engine.GetKey(AssemblyLocation,key,flags),lifetime);
287-
262+
engine.GetRegisteredTaskObject((AssemblyLocation,key),lifetime);
288263

289264
/// <summary>
290265
/// Generic version of IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
291266
/// </summary>
292267
publicstaticTGetRegisteredTaskObjectAssemblyLocal<T>(thisIBuildEngine4engine,objectkey,RegisteredTaskObjectLifetimelifetime)
293-
whereT:class=>GetRegisteredTaskObjectAssemblyLocal<T>(engine,key,lifetime,flags:RegisterTaskObjectKeyFlags.IncludeProjectFile);
294-
295-
/// <summary>
296-
/// Generic version of IBuildEngine4.GetRegisteredTaskObject, but adds the current assembly path into the key
297-
/// </summary>
298-
publicstaticTGetRegisteredTaskObjectAssemblyLocal<T>(thisIBuildEngine4engine,objectkey,RegisteredTaskObjectLifetimelifetime,RegisterTaskObjectKeyFlagsflags)
299268
whereT:class=>
300-
engine.GetRegisteredTaskObject(engine.GetKey(AssemblyLocation,key,flags),lifetime)asT;
269+
engine.GetRegisteredTaskObject((AssemblyLocation,key),lifetime)asT;
301270

302-
/// <summary>
303-
/// IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
304-
/// </summary>
305-
publicstaticobjectUnregisterTaskObjectAssemblyLocal(thisIBuildEngine4engine,objectkey,RegisteredTaskObjectLifetimelifetime)=>
306-
UnregisterTaskObjectAssemblyLocal(engine,key,lifetime,flags:RegisterTaskObjectKeyFlags.IncludeProjectFile);
307271

308272
/// <summary>
309273
/// IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
310274
/// </summary>
311-
publicstaticobjectUnregisterTaskObjectAssemblyLocal(thisIBuildEngine4engine,objectkey,RegisteredTaskObjectLifetimelifetime,RegisterTaskObjectKeyFlagsflags)=>
312-
engine.UnregisterTaskObject(engine.GetKey(AssemblyLocation,key,flags),lifetime);
275+
publicstaticobjectUnregisterTaskObjectAssemblyLocal(thisIBuildEngine4engine,objectkey,RegisteredTaskObjectLifetimelifetime)=>
276+
engine.UnregisterTaskObject((AssemblyLocation,key),lifetime);
313277

314278
/// <summary>
315279
/// Generic version of IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
316280
/// </summary>
317281
publicstaticTUnregisterTaskObjectAssemblyLocal<T>(thisIBuildEngine4engine,objectkey,RegisteredTaskObjectLifetimelifetime)
318-
whereT:class=>UnregisterTaskObjectAssemblyLocal<T>(engine,key,lifetime,flags:RegisterTaskObjectKeyFlags.IncludeProjectFile);
319-
320-
/// <summary>
321-
/// Generic version of IBuildEngine4.UnregisterTaskObject, but adds the current assembly path into the key
322-
/// </summary>
323-
publicstaticTUnregisterTaskObjectAssemblyLocal<T>(thisIBuildEngine4engine,objectkey,RegisteredTaskObjectLifetimelifetime,RegisterTaskObjectKeyFlagsflags)
324282
whereT:class=>
325-
engine.UnregisterTaskObject(engine.GetKey(AssemblyLocation,key,flags),lifetime)asT;
326-
327-
/// <summary>
328-
/// Method to calculate the key for the RegisterTaskObject. This is based on the
329-
/// RegisterTaskObjectKeyFlags which are passed.
330-
/// </summary>
331-
staticobjectGetKey(thisIBuildEngine4engine,stringlocation,objectkey,RegisterTaskObjectKeyFlagsflags)
332-
{
333-
return((flags&RegisterTaskObjectKeyFlags.IncludeProjectFile)!=0)
334-
?(location,key,engine.ProjectFileOfTaskNode)
335-
:(location,key,string.Empty);
336-
}
283+
engine.UnregisterTaskObject((AssemblyLocation,key),lifetime)asT;
337284
}
338285
}

0 commit comments

Comments
 (0)