Skip to content

Use GetExportedTypes where possible and filter nested types #723

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Nov 14, 2018
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
## [unreleased][]

### Added

- Added support for embedding python into dotnet core 2.0 (NetStandard 2.0)
- Added new build system (pythonnet.15.sln) based on dotnetcore-sdk/xplat(crossplatform msbuild).
Currently there two side-by-side build systems that produces the same output (net40) from the same sources.
Expand Down Expand Up @@ -42,6 +43,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
- Fixed errors breaking .NET Remoting on method invoke ([#276][i276])
- Fixed PyObject.GetHashCode ([#676][i676])
- Fix memory leaks due to spurious handle incrementation ([#691][i691])
- Fix spurious assembly loading exceptions from private types ([#703][i703])
- Fix inheritance of non-abstract base methods ([#755][i755])


Expand Down
39 changes: 32 additions & 7 deletions src/runtime/assemblymanager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading;

Expand Down Expand Up @@ -351,9 +352,7 @@ internal static void ScanAssembly(Assembly assembly)
// A couple of things we want to do here: first, we want to
// gather a list of all of the namespaces contributed to by
// the assembly.

Type[] types = assembly.GetTypes();
foreach (Type t in types)
foreach (Type t in GetTypes(assembly))
{
string ns = t.Namespace ?? "";
if (!namespaces.ContainsKey(ns))
Expand Down Expand Up @@ -427,10 +426,9 @@ public static List<string> GetNames(string nsname)
{
foreach (Assembly a in namespaces[nsname].Keys)
{
Type[] types = a.GetTypes();
foreach (Type t in types)
foreach (Type t in GetTypes(a))
{
if ((t.Namespace ?? "") == nsname)
if ((t.Namespace ?? "") == nsname && !t.IsNested)
{
names.Add(t.Name);
}
Expand Down Expand Up @@ -469,5 +467,32 @@ public static Type LookupType(string qname)
}
return null;
}

internal static Type[] GetTypes(Assembly a)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

need a try-catch block here for transitive depedencies

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't it an error, though, if we can't load transitive dependencies?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@filmor i think it is someone else's job to load transitive dependencies, e.g. the direct dependencies should find them on their own:

NuGet/Home#6614

{
if (a.IsDynamic)
{
try
{
return a.GetTypes();
}
catch (ReflectionTypeLoadException exc)
{
// Return all types that were successfully loaded
return exc.Types.Where(x => x != null).ToArray();
}
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@denfromufa Is this what you had in mind?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@filmor this is even more than what i asked for :)

else
{
try
{
return a.GetExportedTypes();
}
catch (FileNotFoundException)
{
return new Type[0];
}
}
}
}
}
}