Different behaviour of same file in different plugins

Hi, I have set of plugins and some plugins was broken after migrating on 4.15
Problem is that blueprint losts all class types from certain plugins when reloading editor. Also it doesn’t allow me to cook the project. I created a minimal testing file to figure out whats happening and checked how it works with each plugin. That file is:

#pragma once

#include "Engine.h"
#include "Object.h"
#include "TestUClass.generated.h"

#define THIS_API CHARAMOD_API
#define THIS_CLASS_NAME(prename) prename ## THIS_API
#define UTHIS_CLASS_NAME_GLUED THIS_CLASS_NAME(UTestBPType_)

UCLASS(BlueprintType)
class THIS_API UTHIS_CLASS_NAME_GLUED : public UObject
{
	GENERATED_UCLASS_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	int32 TestProperty;
};

UTHIS_CLASS_NAME_GLUED::UTHIS_CLASS_NAME_GLUED(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) {};

When this file is added to the plugin was worked fine it’s type works correctly in blueprint and don’t cause any errors. While this file is added to the malfunctioning plugin it’s class could not be reloaded.

.CS File of plugin that working fine:

{
	"FileVersion": 3,
	"Version": 1,
	"VersionName": "1.0",
	"FriendlyName": "Inventory plugin",
	"Description": "Inventory plugin includes new asset types, editors and components allowing you to create flexible customized inventories. Addiionaly plugin provides an interaction system which helps to create ingame interactive objects.",
	"Category": "Gameplay",
	"CreatedBy": "Sunspots, inc.",
	"CreatedByURL": "",
	"DocsURL": "",
	"MarketplaceURL": "",
	"SupportURL": "",
	"EnabledByDefault" : true,
	"CanContainContent": false,
	"IsBetaVersion": false,
	"Installed": false,
	"Modules": [
		{
			"Name": "GameInventory",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		},
		{
			"Name": "GameInventoryEditor",
			"Type": "Editor",
			"LoadingPhase": "Default"
		},
		{
			"Name": "GameInventoryEditorDelayed",
			"Type": "Editor",
			"LoadingPhase": "PostEngineInit"
		}
	]
}

.Bulid file

public class GameInventory : ModuleRules
{
	public GameInventory(TargetInfo Target)
	{
		
		PublicIncludePaths.AddRange(
			new string[] {
				"GameInventory/Public",
				// ... add public include paths required here ...
			}
            );
				
		
		PrivateIncludePaths.AddRange(
			new string[] {
				"GameInventory/Private",
				// ... add other private include paths required here ...
			}
			);
			
		
		PublicDependencyModuleNames.AddRange(
			new string[]
			{
				"Core",
				// ... add other public dependencies that you statically link with here ...
			}
			);
			
		
		PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				"CoreUObject",
				"Engine",
				"Slate",
				"SlateCore",
				"RHI",
				"RenderCore",
                "InputCore",
                "AnimGraphRuntime",
                "UMG",
				// ... add private dependencies that you statically link with here ...	
			}
            );
		
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);
	}
}

.CS File of broken plugin:

{
	"FileVersion": 3,
	"Version": 1,
	"VersionName": "1.0",
	"FriendlyName": "Extended character control modification",
	"Description": "This plugin allows you to build a heavily customizable character movement\r\nreplication system.",
	"Category": "Gameplay",
	"CreatedBy": "Sunspots, inc.",
	"CreatedByURL": "",
	"DocsURL": "",
	"MarketplaceURL": "",
	"SupportURL": "",
	"EnabledByDefault" : true,
	"CanContainContent": false,
	"IsBetaVersion": false,
	"Installed": false,
	"Modules": [
		{
			"Name": "CharaMod",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		},
		{
			"Name": "CharaModEditor",
			"Type": "Editor",
			"LoadingPhase": "Default"
		}
	]
}

Build file:

using UnrealBuildTool;

public class CharaModEditor : ModuleRules
{
	public CharaModEditor(TargetInfo Target)
	{
		PrivateIncludePaths.Add("CharaModEditor/Private");

		PrivateDependencyModuleNames.AddRange(
			new string[] {
				"Core",
				"CoreUObject",
				"Slate",
				"SlateCore",
                "InputCore",
                "Engine",
				"UnrealEd", // for FAssetEditorManager
				"PropertyEditor",
				"RenderCore",
				"EditorStyle",
                "AnimGraph",
                "CharaMod",
                "BlueprintGraph",
                "Kismet",
                "AssetTools",
                "KismetWidgets",
                "KismetCompiler",
                "GraphEditor",
                "Projects",
                "ClassViewer"
            }
        );
	}
}

On 4.12 it was working without any problems

Error screenshot:

Temporary fixed by changing broken plugin’s loading order to the PreDefault in its .uplugin file:

	"Modules": [
		{
			"Name": "CharaMod",
			"Type": "Runtime",
			"LoadingPhase": "PreDefault"
		},
		{
			"Name": "CharaModEditor",
			"Type": "Editor",
			"LoadingPhase": "PreDefault"
		}
	]

Hi c4tnt,

There were a few bugs related to plugin loading that were fixed in 4.15, and those fixes resulted in unexpected changes in some projects. For example, prior to 4.15, setting EnabledByDefault to false would have been ignored and the plugin would have been always enabled, so any plugins with this setting suddenly would not work if the plugin was not explicitly enabled. I suspect that the issue that you were experiencing is a result of these fixes, and your solution should be the correct way to handle it.

Tim