示例#1
0
        public static void TieManagedToUnmanaged(Object managed, IntPtr unmanaged,
                                                 StringName nativeName, bool refCounted, Type type, Type nativeType)
        {
            var gcHandle = refCounted ?
                           CustomGCHandle.AllocWeak(managed) :
                           CustomGCHandle.AllocStrong(managed, type);

            if (type == nativeType)
            {
                var nativeNameSelf = (godot_string_name)nativeName.NativeValue;
                NativeFuncs.godotsharp_internal_tie_native_managed_to_unmanaged(
                    GCHandle.ToIntPtr(gcHandle), unmanaged, nativeNameSelf, refCounted.ToGodotBool());
            }
            else
            {
                unsafe
                {
                    // We don't dispose `script` ourselves here.
                    // `tie_user_managed_to_unmanaged` does it for us to avoid another P/Invoke call.
                    godot_ref script;
                    ScriptManagerBridge.GetOrLoadOrCreateScriptForType(type, &script);

                    // IMPORTANT: This must be called after GetOrCreateScriptBridgeForType
                    NativeFuncs.godotsharp_internal_tie_user_managed_to_unmanaged(
                        GCHandle.ToIntPtr(gcHandle), unmanaged, &script, refCounted.ToGodotBool());
                }
            }
        }
示例#2
0
        public SignalAwaiter(Object source, StringName signal, Object target)
        {
            var awaiterGcHandle = CustomGCHandle.AllocStrong(this);

            using godot_string_name signalSrc = NativeFuncs.godotsharp_string_name_new_copy(
                      (godot_string_name)(signal?.NativeValue ?? default));
            NativeFuncs.godotsharp_internal_signal_awaiter_connect(Object.GetPtr(source), in signalSrc,
                                                                   Object.GetPtr(target), GCHandle.ToIntPtr(awaiterGcHandle));
        }
示例#3
0
 internal static void FreeGCHandle(IntPtr gcHandlePtr)
 {
     try
     {
         CustomGCHandle.Free(GCHandle.FromIntPtr(gcHandlePtr));
     }
     catch (Exception e)
     {
         ExceptionUtils.LogException(e);
     }
 }
示例#4
0
        public static void TieManagedToUnmanagedWithPreSetup(Object managed, IntPtr unmanaged,
                                                             Type type, Type nativeType)
        {
            if (type == nativeType)
            {
                return;
            }

            var strongGCHandle = CustomGCHandle.AllocStrong(managed);

            NativeFuncs.godotsharp_internal_tie_managed_to_unmanaged_with_pre_setup(
                GCHandle.ToIntPtr(strongGCHandle), unmanaged);
        }