I'm trying to validate that Protocol Buffers is going to work with the new portable runtimes from the ASP.NET team and ideally most other modern environments. The 3.0.0-alpha4 build was created a while ago using profile259, so I would expect some changes to be required in some cases, but I thought I'd give it a try. I'm aware of Oren Novotny's post about targeting .NET Core, and expected to have to make some changes to the Google.Protobuf nuspec file, but the error I'm running into has me stumped.
DNX version: 1.0.0-rc1-update1
The scenario I'm currently trying to test is a console app targeting dnx451. I have a very simple sample app:
using Google.Protobuf.WellKnownTypes;
using System;
public class Program
{
public static void Main(string[] args)
{
Duration duration = new Duration { Seconds = 100, Nanos = 5555 };
Console.WriteLine(duration);
}
}
... and a tiny project.json:
{
"compilationOptions": { "emitEntryPoint": true },
"dependencies": { "Google.Protobuf": "3.0.0-alpha4" },
"frameworks": {
"dnx451": { }
}
}
Note that I'm not even using dnxcore* here - ironically, I got that to work without issues.
dnu restore works fine; dnx run fails with:
Error: c:\Users\Jon\Test\Projects\protobuf-coreclr\src\ProtobufTest\Program.cs(9,9): DNX,Version=v4.5.1 error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
The following changes result in the same error:
"System.Runtime": "4.0.0" in the dependencies section for the framework"System.Runtime": "4.0.0-beta-23109" in the dependencies section for the framework, and likewise for 4.0.10-beta-*, 4.0.20-beta-* and 4.0.21-beta*.System.Runtime within the NuGet package (locally) and rebuilding against that - project.lock.json was updated to include System.Runtime v4.0.0, but the same error occurredlib\dotnet directory in the package, as well as the dependenciesSteps that did work (independently, and with no dependencies entries), but confuse me:
Console.WriteLine call to just Console.WriteLine("foo") (but no other changes)duration variable to object instead of DurationTimeSpan or similarAdding the following to project.json in the dnx451 section:
"frameworkAssemblies": {
"System.Runtime": ""
}
Ultimately, I don't want users to have to do this - at least, not for the sake of Protocol Buffers. I'm assuming this is something to do with how we're building Protocol Buffers, but as I don't understand the cause properly, it's hard to fix.
I expect that if I could work out a way of making a dependencies entry work, I could then add that dependency into Protocol Buffers itself, which would be fine - but as having a dependency on System.Runtime v4.0.0 in the project.lock file doesn't seem to help, I must be missing something :(

I've accepted David Fowler's answer as the reason why all of this happened. Now in terms of what I should do about it, it looks like I just need to add a frameworkAssemblies element in the nuspec file for Google.Protobuf:
<package>
<metadata>
...
<frameworkAssemblies>
<frameworkAssembly assemblyName="System.Runtime" targetFramework="net45" />
</frameworkAssemblies>
</metadata>
...
</package>
That frameworkAssembly reference then ends up in the project.lock.json in the client project, and all is well.
However, judging by David's other comment ("We're going to look at fixing this") I may not need to do anything anyway...
See more on this question at Stackoverflow