COM-объект, который был разделен от его базового RCW, не может использоваться - почему это происходит?

Как насчет игры на этом? Уникальные случайные числа, не будучи должен использовать Набор или Хеш.

x = 0
(1..100).map{|iter| x += rand(100)}.shuffle
5
задан C-Pound Guru 29 September 2009 в 14:28
поделиться

2 ответа

Кажется, что проблема вызвана созданием DirectoryEntry из NativeObject в AdUser. Когда я изменил AdUser с:

public class AdUser : DirectoryEntry 
{ 
public AdUser(DirectoryEntry entry) 
: base(entry.NativeObject) 
{ 
} 
} 

и создал обертку, которая рассматривает DirectoryEntry как компонент:

public class ActiveDirectoryObject : IDisposable 
{ 
private bool disposed; 
public DirectoryEntry Entry { get; protected set; } 

public ActiveDirectoryObject(DirectoryEntry entry) 
{ 
Entry = entry; 
} 

public void CommitChanges() 
{ 
Entry.CommitChanges(); 
} 

public void Dispose() 
{ 
Dispose(true); 
GC.SuppressFinalize(this); 
} 

private void Dispose(bool disposing) 
{ 
if (!this.disposed) 
{ 
if (disposing) 
{ 
if (Entry != null) Entry.Dispose(); 
} 
disposed = true; 
} 
} 
} 

public class AdUser : ActiveDirectoryObject 
{ 
public AdUser(DirectoryEntry entry) 
: base(entry) 
{ 
} 
} 

Тогда я не понимаю этих ошибок. Дальнейшие подробности здесь: http://directoryprogramming.net/forums/thread/7171.aspx

2
ответ дан 14 December 2019 в 19:19
поделиться

Да, возможно, объект DirectoryEntry удален из-за сборки мусора. Сборщик мусора работает в собственном потоке, поэтому возможна гонка при очистке RCW.

Попытайтесь сохранить ссылку на него в своем объекте AdUser. Т.е. должно получиться так

public class AdUser : DirectoryEntry 
{ 
  DirectoryEntry entry;
    public AdUser(DirectoryEntry entry) : base(entry.NativeObject) 
    { 
      this.entry = entry;
    } 
    ...
}
3
ответ дан 14 December 2019 в 19:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: