Переменная типа всегда возвращает ноль при запуске метода GetTypes () - PullRequest
0 голосов
/ 13 февраля 2019

Я столкнулся с довольно неприятной проблемой.Я пытаюсь аутентифицировать пользователя в Active Directory, и для этого я передаю свои пользовательские переменные в следующий класс.

        public static ILdapAuthentication CreateInstance(string domainAndUser, string password, string ldapPath)
    {
        string[] dllPaths = Directory.GetFiles(ExecutingAssemblyDirectory, "*.dll");

        List<Assembly> listOfAssemblies = new List<Assembly>();

        foreach (var dllPath in dllPaths.Where(x => x.Contains("ActiveDirectoryAuthentication")))
        {
            Assembly assembly = Assembly.LoadFrom(dllPath);
            listOfAssemblies.Add(assembly);
        }

        Type type = null;

        int foundTypes = 0;
        foreach (var assembly in listOfAssemblies)
        {
            type =
               assembly.GetTypes()
                   .FirstOrDefault(x => x.GetInterfaces().Any(i => i == typeof(ILdapAuthentication)));

            if (type == null)
                continue;

            foundTypes++;
        }

        if (foundTypes == 0)
            throw new Exception("ActiveDirectoryAuthentication DLL not found.");

        if (foundTypes > 1)
            throw new Exception("Only one ActiveDirectoryAuthentication DLL must be used.");

        return Activator.CreateInstance(type, domainAndUser, password, ldapPath) as ILdapAuthentication;
    }

Проблема возникает в цикле foreach, так как я пытаюсь получить свои типы, он всегда возвращает ноль и даже не попадает в код интерфейса (ILDPAuthentication), приведенный ниже.

    public interface ILdapAuthentication
{
    bool IsActiveDirectoryUserValid();
}

, который вызывает следующий код:

    public class LdapAuthentication : ILdapAuthentication
{
    private string DomainAndUser { get; set; }
    private string Password { get; set; }
    private string LdapPath { get; set; }

    public LdapAuthentication(string domainAndUser, string password, string ldapPath)
    {
        this.DomainAndUser = domainAndUser;
        this.Password = password;
        this.LdapPath = ldapPath;
    }

    public bool IsActiveDirectoryUserValid()
    {
        try
        {
            if (!this.DomainAndUser.Contains('\\'))
                throw new Exception("Domain User is invalid.");

            string[] userLogin = this.DomainAndUser.Split('\\');
            string domain = userLogin[0];
            string userName = userLogin[1];

            DirectoryEntry entry = new DirectoryEntry(this.LdapPath, this.DomainAndUser, this.Password);
            object obj = entry.NativeObject;

            DirectorySearcher search = new DirectorySearcher(entry);

            search.Filter = "(SAMAccountName=" + userName + ")";
            search.PropertiesToLoad.Add("CN");

            SearchResult result = search.FindOne();

            if (null == result)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            throw;
        }
    }
}

Первоначальный класс ищет библиотеки DLL в папке моего приложения под названием ActiveDirectoryAuthentication, в которую я скопировал.

1 Ответ

0 голосов
/ 13 февраля 2019

Я видел это раньше - типы в явно загруженной сборке не совпадают с типами в ссылочном проекте.Поскольку вы используете:

i == typeof(ILdapAuthentication)

, вы полагаетесь на сравнение равенства для класса Type, которое может не возвращать равенство, когда вы ожидаете этого.Вместо этого я предлагаю вам:

i.FullName == typeof(ILdapAuthentication).FullName

, который будет использовать простое сравнение строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...