diff --git a/src/Generator/Generators/CSharp/CSharpSources.cs b/src/Generator/Generators/CSharp/CSharpSources.cs
index f2ce2ed2..d8311816 100644
--- a/src/Generator/Generators/CSharp/CSharpSources.cs
+++ b/src/Generator/Generators/CSharp/CSharpSources.cs
@@ -189,7 +189,12 @@ namespace CppSharp.Generators.CSharp
context.Declarations.Any(d => d.IsGenerated || (d is Class && !d.IsIncomplete));
using var _ = shouldGenerateNamespace
- ? PushWriteBlock(BlockKind.Namespace, $"namespace {context.Name}", NewLineKind.BeforeNextBlock)
+ ?
+ (
+ Options.GenerateTypesOnly && context.Name != Options.GenerateTypesRootNamespace
+ ? PushWriteBlock(BlockKind.Class, $"public partial class {context.Name}", NewLineKind.BeforeNextBlock)
+ : PushWriteBlock(BlockKind.Namespace, $"namespace {context.Name}", NewLineKind.BeforeNextBlock)
+ )
: default;
return base.VisitNamespace(@namespace);
@@ -254,11 +259,26 @@ namespace CppSharp.Generators.CSharp
if (classes.FindAll(cls => cls.IsValueType && cls.Name == parentName && context.QualifiedLogicalName == cls.Namespace.QualifiedLogicalName).Any())
keyword = "struct";
- if (Options.GenerateTypesOnly && Options.PutAllGlobalsInGlobalClass)
- parentName = "Globals";
+ bool generate = true;
- WriteLine($"public unsafe partial {keyword} {parentName}");
- WriteOpenBraceAndIndent();
+ if (Options.GenerateTypesOnly)
+ {
+ if (context is Namespace n)
+ {
+ if (n.Name == Options.GenerateTypesRootNamespace)
+ parentName = "Globals";
+ else if (!string.IsNullOrEmpty(n.Name))
+ generate = false;
+ else if (Options.PutAllGlobalsInGlobalClass)
+ parentName = "Globals";
+ }
+ }
+
+ if (generate)
+ {
+ WriteLine($"public unsafe partial {keyword} {parentName}");
+ WriteOpenBraceAndIndent();
+ }
if (Options.GenerateBindings)
{
@@ -293,8 +313,11 @@ namespace CppSharp.Generators.CSharp
v => v.IsGenerated && v.Access == AccessSpecifier.Public))
GenerateVariable(null, variable);
- UnindentAndWriteCloseBrace();
- PopBlock(NewLineKind.BeforeNextBlock);
+ if (generate)
+ {
+ UnindentAndWriteCloseBrace();
+ PopBlock(NewLineKind.BeforeNextBlock);
+ }
}
private void GenerateClassTemplateSpecializationInternal(Class classTemplate)
diff --git a/src/Generator/Options.cs b/src/Generator/Options.cs
index 3b84a2ae..e45df870 100644
--- a/src/Generator/Options.cs
+++ b/src/Generator/Options.cs
@@ -93,6 +93,7 @@ namespace CppSharp
/// true to generate class templates; otherwise, false.
///
public bool GenerateClassTemplates { get; set; }
+ public string GenerateTypesRootNamespace { get; set; } = String.Empty;
public bool GenerateTypesOnly { get; set; } = false;
internal bool GenerateBindings => !GenerateTypesOnly;
public bool AllowRenaming { get; set; } = true;