Search Unity

  1. Unity 6 Preview is now available. To find out what's new, have a look at our Unity 6 Preview blog post.
    Dismiss Notice
  2. Unity is excited to announce that we will be collaborating with TheXPlace for a summer game jam from June 13 - June 19. Learn more.
    Dismiss Notice

NetworkBehaviour in External DLL

Discussion in 'Multiplayer' started by TiUh, Nov 16, 2015.

  1. TiUh

    TiUh

    Joined:
    Nov 16, 2015
    Posts:
    4
    Hello together,

    I develop my Game with Visual Studio and compile it to an DLL, to place it in my Unity Plugin Folder and use it in Unity. My game is a multiplayer game so I have to use, since Unity 5.2, UnityEngine.Networking.NetworkBehaviour from "...\Unity\Editor\Data\UnityExtensions\Unity\Networking\UnityEngine.Networking.dll". But after switching my Classes inheritance form MonoBehaviour to NetworkBehaviour, these class are no longer avaible in UnityEditor.
    And I am getting follwing error:

    Code (csharp):
    1.  
    2. System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Mono.Cecil.AssemblyResolutionException: Failed to resolve assembly: 'UnityEngine.Networking, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
    3.   at Mono.Cecil.BaseAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name, Mono.Cecil.ReaderParameters parameters) [0x00000] in <filename unknown>:0
    4.   at Mono.Cecil.BaseAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name) [0x00000] in <filename unknown>:0
    5.   at Mono.Cecil.DefaultAssemblyResolver.Resolve (Mono.Cecil.AssemblyNameReference name) [0x00000] in <filename unknown>:0
    6.   at Mono.Cecil.MetadataResolver.Resolve (Mono.Cecil.TypeReference type) [0x00000] in <filename unknown>:0
    7.   at Mono.Cecil.ModuleDefinition.Resolve (Mono.Cecil.TypeReference type) [0x00000] in <filename unknown>:0
    8.   at Mono.Cecil.TypeReference.Resolve () [0x00000] in <filename unknown>:0
    9.   at AssemblyUpdater.Steps.MemberReferenceReplacer.MemberReferenceReplacementForProperty (Mono.Cecil.MethodReference method) [0x00000] in <filename unknown>:0
    10.   at AssemblyUpdater.Steps.MemberReferenceReplacer.MemberReferenceReplacementFor (Mono.Cecil.MethodReference methodReference) [0x00000] in <filename unknown>:0
    11.   at AssemblyUpdater.Steps.MemberReferenceReplacer.Visit (Mono.Cecil.MethodReference methodReference, Unity.Cecil.Visitor.Context context) [0x00000] in <filename unknown>:0
    12.   at Unity.Cecil.Visitor.Visitor.Visit (Mono.Cecil.Cil.Instruction instruction, Unity.Cecil.Visitor.Context context) [0x00000] in <filename unknown>:0
    13.   at Unity.Cecil.Visitor.Visitor.Visit (Mono.Cecil.Cil.MethodBody methodBody, Unity.Cecil.Visitor.Context context) [0x00000] in <filename unknown>:0
    14.   at Unity.Cecil.Visitor.Visitor.Visit (Mono.Cecil.MethodDefinition methodDefinition, Unity.Cecil.Visitor.Context context) [0x00000] in <filename unknown>:0
    15.   at Unity.Cecil.Visitor.Visitor.Visit (Mono.Cecil.PropertyDefinition propertyDefinition, Unity.Cecil.Visitor.Context context) [0x00000] in <filename unknown>:0
    16.   at Unity.Cecil.Visitor.Visitor.Visit (Mono.Cecil.TypeDefinition typeDefinition, Unity.Cecil.Visitor.Context context) [0x00000] in <filename unknown>:0
    17.   at Unity.Cecil.Visitor.Visitor.Visit (Mono.Cecil.ModuleDefinition moduleDefinition, Unity.Cecil.Visitor.Context context) [0x00000] in <filename unknown>:0
    18.   at Unity.Cecil.Visitor.Visitor.Visit (Mono.Cecil.AssemblyDefinition assemblyDefinition, Unity.Cecil.Visitor.Context context) [0x00000] in <filename unknown>:0
    19.   at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
    20.   at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
    21.   --- End of inner exception stack trace ---
    22.   at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
    23.   at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in <filename unknown>:0
    24.   at Unity.Cecil.Visitor.Visitor.Visit[AssemblyDefinition] (Mono.Cecil.AssemblyDefinition node, Unity.Cecil.Visitor.Context context) [0x00000] in <filename unknown>:0
    25.   at Unity.Cecil.Visitor.Extensions.DoAccept[AssemblyDefinition] (Mono.Cecil.AssemblyDefinition definition, Unity.Cecil.Visitor.Visitor visitor) [0x00000] in <filename unknown>:0
    26.   at Unity.Cecil.Visitor.Extensions.Accept (Mono.Cecil.AssemblyDefinition assemblyDefinition, Unity.Cecil.Visitor.Visitor visitor) [0x00000] in <filename unknown>:0
    27.   at AssemblyUpdater.Steps.AssemblyUpdaterStepBase.Apply (AssemblyUpdater.Core.AssemblyUpdaterContext context) [0x00000] in <filename unknown>:0
    28.   at AssemblyUpdater.Core.AssemblyUpdaterPipeline.Run (AssemblyUpdater.Core.AssemblyUpdaterContext context) [0x00000] in <filename unknown>:0
    29.   at AssemblyUpdater.Application.Program.CheckForObsoleteAPIUsage (AssemblyUpdater.Application.CommandLineSpec config) [0x00000] in <filename unknown>:0
    30.   at AssemblyUpdater.Application.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0
    31. UnityEditor.Scripting.APIUpdaterHelper:DoesAssemblyRequireUpgrade(String)
    32.  
    Had someone the same problems? Or has an idea to solve this problem?

    Greetings,
    Tim
     
  2. seanr

    seanr

    Unity Technologies

    Joined:
    Sep 22, 2014
    Posts:
    669
    The post-processor that UNet uses does not support code in external DLLs. The code must be part of the unity project.
     
  3. TiUh

    TiUh

    Joined:
    Nov 16, 2015
    Posts:
    4
    Ok, thank you.
    Will this ever be possible or not?
     
  4. deemen

    deemen

    Joined:
    Dec 29, 2013
    Posts:
    17
    @seanr

    I've investigated this myself and it seems there is no reason the UNetWeaver could not be made to run on an external DLL as a post-build step, except that it currently filters for assemblies starting with "Assembly-". Could Unity release a tool to post-process DLLs manually so they can be shipped in the asset store with NetworkBehaviours?

    Using DLLs with UNet is further complicated by this bug: https://issuetracker.unity3d.com/is...t-recognized-if-they-inherit-networkbehaviour
     
    in0finite likes this.
  5. in0finite

    in0finite

    Joined:
    Oct 23, 2017
    Posts:
    31
    @deemen

    I created a small program which can post-process the DLL, using Unity's unet weaver DLL. You just give him the path to unity installation, and he will automatically load unet weaver DLL, and invoke a method inside it, which processes DLL.

    You can find it here => https://github.com/in0finite/UnityLibraryPostProcessor.

    I use it in uGameCore asset and in a couple of games, and it works perfectly.
     
    softrare likes this.
  6. softrare

    softrare

    Joined:
    Jun 12, 2011
    Posts:
    444
    Thanks for this! Unfortunately it doesn't work for me

    Code (CSharp):
    1. "C:\Program Files\Unity\Editor\Data\Mono\bin\mono.exe" UnityLibraryPostProcessor.exe "C:\Program Files\Unity\" Assembly-<assemblyname>.dll
    2. WARNING: The runtime version supported by this application is unavailable.
    3. Using default runtime: v1.1.4322
    4. The assembly mscorlib.dll was not found or could not be loaded.
    5. It should have been installed in the `C:\Program Files\Unity\Editor\Data\Mono\lib\mono\1.0\mscorlib.dll' directory.
    If I copy over from mono\2.0 to 1.0 it says

    Code (CSharp):
    1.  
    2. WARNING: The runtime version supported by this application is unavailable.
    3. Using default runtime: v1.1.4322
    4. Missing method System.Reflection.Assembly::op_Equality(Assembly,Assembly) in assembly C:\Program Files\Unity\Editor\Data\Mono\lib\mono\1.0\mscorlib.dll, referenced in assembly <dir>/UnityLibraryPostProcessor.exe
    5.  
    6. Unhandled Exception: System.MissingMethodException: Method not found: 'System.Reflection.Assembly.op_Equality'.
    7.  
    I call the program like this

    Code (CSharp):
    1. "C:\Program Files\Unity\Editor\Data\Mono\bin\mono.exe" UnityLibraryPostProcessor.exe "C:\Program Files\Unity\" Assembly-<assemblyname>.dll
    Do I need a specific mscorlib.dll or do I call something incorrectly?