Home > Software engineering >  System.MissingMethodException after adding a project reference (without using the reference)
System.MissingMethodException after adding a project reference (without using the reference)

Time:08-17

I have encountered a strange error that is unexplainable to me. I have a .NET 6 class library project (A) that has the function:

public async Task ImportDeliveries()
{
    try
    {
        var csvFileProcessor = new CsvFileProcessor();
        await csvFileProcessor.ProcessAllAsync(_DeliveryImporter.ImportAsync).ConfigureAwait(true);
    }
    catch (Exception ex)
    {
        _TelemetryClient.TrackException(ex);
    }
}

It works fine. However, as soon as I add the project reference of another .NET 6 class library (B) to the project, without changing anything else, the function

await csvFileProcessor.ProcessAllAsync(_DeliveryImporter.ImportAsync).ConfigureAwait(true);

fails and throws the following exception:

System.MissingMethodException: 'Method not found: 'System.Threading.Tasks.Task BlobStorageHelper.BlobStorageFolder.MoveAsync(Microsoft.Azure.Storage.Blob.CloudBlockBlob, BlobStorageHelper.BlobStorageFolder)'.'

Can this be caused because (B) contains certain nuget packages? This behavior is very counterintuitive to me, and I'm not sure where to start looking.

CodePudding user response:

This is probably caused by:

  • Your project, A, referencing a class library C, in which CsvFileProcessor and BlobStorageHelper.BlobStorageFolder are defined (the latter could also be in a transitive dependency, D).
  • Project B also references class library C (and/or D), but a different version.
  • Someone modified, added or removed System.Threading.Tasks.Task BlobStorageHelper.BlobStorageFolder.MoveAsync(Microsoft.Azure.Storage.Blob.CloudBlockBlob, BlobStorageHelper.BlobStorageFolder) in some version of C or D.
  • You're not properly implementing Semantic Versioning within C or D, so MSBuild is restoring a version of C or D that doesn't contain the required method.

Hence the error.

Takeaway: changing a signature or return type is breaking the ABI (application binary interface), requiring a major version update.

To fix this, you could revert the signature or return type change, and add an overload instead.

  • Related