private long GetAssemblyId(WriteObjectInfo objectInfo)
{
//use objectInfo to get assembly string with new criteria
InternalST.Soap( this, "GetAssemblyId Entry ",objectInfo.objectType," isSi ",objectInfo.isSi);
long assemId = 0;
bool isNew = false;
String assemblyString = objectInfo.GetAssemblyString();
String serializedAssemblyString = assemblyString;
if (assemblyString.Length == 0)
{
// Fake type could returns an empty string
assemId = 0;
}
else if (assemblyString.Equals(Converter.urtAssemblyString))
{
// Urt type is an assemId of 0. No assemblyString needs
// to be sent but for soap, dotted names need to be placed in header
InternalST.Soap( this, "GetAssemblyId urt Assembly String ");
assemId = 0;
isNew = false;
serWriter.WriteAssembly(objectInfo.GetTypeFullName(), objectInfo.objectType, null, (int)assemId, isNew, objectInfo.IsAttributeNameSpace());
}
else
{
// Assembly needs to be sent
// Need to prefix assembly string to separate the string names from the
// assemblyName string names. That is a string can have the same value
// as an assemblyNameString, but it is serialized differently
if (assemblyToIdTable.ContainsKey(assemblyString))
{
assemId = (long)assemblyToIdTable[assemblyString];
isNew = false;
}
else
{
assemId = m_idGenerator.GetId("___AssemblyString___"+assemblyString, out isNew);
assemblyToIdTable[assemblyString] = assemId;
}
if (assemblyString != null && !objectInfo.IsInteropNameSpace())
{
if (formatterEnums.FEassemblyFormat == FormatterAssemblyStyle.Simple)
{
// Use only the simple assembly name (not version or strong name)
int index = assemblyString.IndexOf(',');
if (index > 0)
serializedAssemblyString = assemblyString.Substring(0, index);
}
}
serWriter.WriteAssembly(objectInfo.GetTypeFullName(), objectInfo.objectType, serializedAssemblyString, (int)assemId, isNew, objectInfo.IsInteropNameSpace());
}
InternalST.Soap( this, "GetAssemblyId Exit id ",assemId," isNew ",isNew," assemblyString ",serializedAssemblyString);
return assemId;
}