I have three projects, P / A / B. All of them are built into self-contained executable binaries. A & B are referenced in P because they are child processes launched by P.
This works well. When I run dotnet publish --configuration Release --self-contained --runtime win-x64 in directory of P.csproj, there will be three executable files there. P.exe / A.exe / B.exe. All of them are self-contained.
Now in Visual Studio 2022, right-click on project B, and select "Manage Nuget Packages" in popup menu.
Then I add Microsoft.Orleans.CodeGenerator.MSBuild reference in B.csproj, the csproj file is changed to following, and the output B.exe is not self-contained any more!
It seems that <PrivateAssets>all</PrivateAssets> will force B.exe to be built with shared framework even if <SelfContained>true</SelfContained> is configured in B.csproj.
Now I received the following error.
System.TypeAccessException: Named type "ValueTuple2<MessageMetadata1,MessageBox>" is invalid: Type string "XXX.MessageKey" cannot be resolved.
XXX.MessageKey is defined in a 3rd-party's assembly which does not have reference to Microsoft.Orleans.Core.Abstractions.
Hence in B project, I have the following code, but it does not work.
[assembly: Orleans.CodeGeneration.KnownAssembly(typeof(XXX.MessageKey))]
.ConfigureApplicationParts( parts =>
{
parts.AddFromApplicationBaseDirectory();
parts.AddApplicationPart(typeof(XXX.MessageKey).Assembly);
})
I do see this type is included in the generated code of assembly of project B.
But still it fails with TypeAccessException
System.TypeAccessException: Named type "ValueTuple`2<MessageMetadata`1<XXX.MessageKey>,MessageBox>" is invalid: Type string "XXX.MessageKey" cannot be resolved.
at Orleans.Serialization.BinaryTokenStreamReaderExtensinons.ReadSpecifiedTypeHeader[TReader](TReader this, SerializationManager serializationManager) in /_/src/Orleans.Core/Serialization/BinaryTokenStreamReader.cs:line 431
at Orleans.Serialization.BinaryTokenStreamReaderExtensinons.ReadFullTypeHeader[TReader](TReader this, SerializationManager serializationManager, Type expected) in /_/src/Orleans.Core/Serialization/BinaryTokenStreamReader.cs:line 466
at Orleans.Serialization.BinaryTokenStreamReaderExtensinons.ReadSpecifiedTypeHeader[TReader](TReader this, SerializationManager serializationManager) in /_/src/Orleans.Core/Serialization/BinaryTokenStreamReader.cs:line 353
at Orleans.Serialization.SerializationManager.DeserializeInner[TContext,TReader](SerializationManager sm, Type expected, TContext context, TReader reader) in /_/src/Orleans.Core/Serialization/SerializationManager.cs:line 1298
at Orleans.Serialization.BuiltInTypes.DeserializeInvokeMethodRequest(Type expected, IDeserializationContext context) in /_/src/Orleans.Core/Serialization/BuiltInTypes.cs:line 2100
at Orleans.Serialization.SerializationManager.DeserializeInner[TContext,TReader](SerializationManager sm, Type expected, TContext context, TReader reader) in /_/src/Orleans.Core/Serialization/SerializationManager.cs:line 1349
at Orleans.Runtime.Messaging.MessageSerializer.OrleansSerializer`1.Deserialize(ReadOnlySequence`1 input, T& value) in /_/src/Orleans.Core/Messaging/MessageSerializer.cs:line 151
at Orleans.Runtime.Messaging.MessageSerializer.TryRead(ReadOnlySequence`1& input, Message& message) in /_/src/Orleans.Core/Messaging/MessageSerializer.cs:line 76
at Orleans.Runtime.Messaging.Connection.ProcessIncoming() in /_/src/Orleans.Core/Networking/Connection.cs:line 358
The issue is from Heterogeneous silos. All silos must be deployed even if this grain type is not hosted by some silos. otherwise it causes that error when that silo is selected as gateway
.NET Core v6. Orleans v3.6.0
I have three projects, P / A / B. All of them are built into self-contained executable binaries. A & B are referenced in P because they are child processes launched by P.
P.csproj :
A.csproj :
B.csproj (v0, binary is self-contained)
This works well. When I run
dotnet publish --configuration Release --self-contained --runtime win-x64
in directory of P.csproj, there will be three executable files there. P.exe / A.exe / B.exe. All of them are self-contained.Now in Visual Studio 2022, right-click on project B, and select "Manage Nuget Packages" in popup menu. Then I add
Microsoft.Orleans.CodeGenerator.MSBuild
reference in B.csproj, the csproj file is changed to following, and the output B.exe is not self-contained any more!B.csproj (v1, shared framework)
Then I manually edit B.csproj. Remove
<PrivateAssets>all</PrivateAssets>
. And the compiled B.exe is self-contained again.B.csproj (v2, self-contained again)
It seems that
<PrivateAssets>all</PrivateAssets>
will force B.exe to be built with shared framework even if<SelfContained>true</SelfContained>
is configured in B.csproj.Now I received the following error.
XXX.MessageKey
is defined in a 3rd-party's assembly which does not have reference toMicrosoft.Orleans.Core.Abstractions
. Hence in B project, I have the following code, but it does not work.I do see this type is included in the generated code of assembly of project B.
But still it fails with
TypeAccessException