Oracle oci.dll в каталоге bin ASP.NET не может быть удалена / работа

Я следовал за направлениями здесь: http://splinter.com.au/blog/?p=156 в попытке использовать более новую версию ODP.NET, не устанавливая клиент 11 г Oracle. Я следовал за всем, до сих пор, за исключением перезапуска IIS.

Однако это вызвало некоторые проблемы, и мне действительно любопытно относительно почему. Если я пытаюсь использовать ODP.NET, я встречен за пустым исключением, выданным, когда соединение Oracle пытается соединиться (ConnectExample. Открытый (), например).

Но наиболее любопытно: Я не могу удалить oci.dll. Это говорит, что используется. Что могло использовать этот dll? Что точно ASP.NET делает с собственным dll, когда это в Каталоге bin? Я думал, что, возможно, это - что-то включающее oci.dll, но если я использую dll подобным способом в настольном приложении WinForm затем, oci.dll не становится заблокированным, и я могу удалить его свободно.

Кроме того, после того, как я пытался использовать его нормальная система. Данные. OracleClient прекратил работать. Это теперь выдает исключение, которое OCIEnvCreate возвращает с-1.

Я попытаюсь перезапустить IIS, и надо надеяться который зафиксирует это, но я хотел бы знать то, что продолжается здесь (и если он может быть решен, не перезапуская IIS). У кого-либо есть идея?

Править: Я пытался перезапустить IIS, и это не починило вещь

Редактирование № 2: Я не думаю, что сформулировал этот вопрос очень хорошо, но это происходило из-за моего принятия, перезапускающего IIS, будет работать. Теперь я просто должен знать, почему это не работает. В поиске с помощью Google для подобных проблем я только встретился с 2 сообщениями форума, которые сказали о моей точной проблеме: Oracle ODP.NET, возвращая пустое исключение при попытке соединиться. Вот ссылки на тех:

http://kr.forums.oracle.com/forums/thread.jspa?threadID=632296

http://forums.oracle.com/forums/thread.jspa?threadID=549864

Корейская ссылка выше является самой интересной. У них есть полная установка, которая приводит меня подозревать, что моя проблема не с файлами или недостающими файлами. Интересно, что они подразумевают "под рабочими серверами, выдающими пустые исключения, если вызов к DLL OCI выполняется перед ODP можно быть установлен"?

Редактирование/Обновление № 3: у Нас есть сервер интранет здесь для нашего отдела, на котором я смог протестировать сегодня. Я добавил необходимый dll's к папке Bin, и все работало без потребности перезапустить IIS. Я не спрашиваю. Я попробую еще некоторое тестирование на этом сервере, чтобы видеть, могу ли я копировать проблему

Редактирование № 4 (одиссея продолжается): Я решил, что oraocci11.dll (интерфейс DLL вызова C++) необходим первоначально ASP.NET (или библиотека ODP.NET) для ровного нахождения 11-граммового клиентского dll's, после что oraocci11.dll, кажется, никогда не используется снова и может быть удален. Не уверенный, что это означает для моей проблемы, но так как она добавляет к базе знаний здесь, что я полагал, что упомяну это

Редактирование № 5: Я добавил mfc71.dll и msvcr71.dll, 2 системных файла Windows, имеющие дело с C/MFC, к Каталогу bin, поскольку я обнаружил, что они необходимы ODP.NET (или по крайней мере, необходимые клиенту). Это, по крайней мере, заставило вещи остаться на старом знакомом "Клиенте не совместимая" ошибка. Я удалил те 2 DLLs, и конечно же это вернулось к тем же ошибкам, данным выше. Добавление их назад не совершало те ошибки, уходят, однако, таким образом, я должен буду сбросить IIS снова.

5
задан Bob 1 March 2010 в 23:50
поделиться

3 ответа

Что касается DLL, вам придется остановить IIS, удалить их, затем начать IIS. Это потому, что они родные DLL, а не C # DLL's. C # Функция «Shadow Copy» не распространяется на нативную DLL, поэтому они заблокированы.

Что касается Oracle, я по электронной почте вам несколько вещей, чтобы попробовать ... Действительно, мы должны обновить эту страницу, когда вы найдете решение.

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

Целью интерфейса является определение контракта между несколькими объектами, независимо от конкретной реализации.

Поэтому его обычно используют при наличии Intrace ISomething и конкретной реализации

class Something : ISomething

Поэтому переменную Interface можно использовать при создании контракта:

ISomething myObj = new Something();
myObj.SomeFunc();

Также следует прочитать интерфейс C #

Update:

Я объясню логику использования интерфейса для переменной, а не самого класса на примере (реальной жизни):

У меня есть универсальный интерфейс репозитора:

Interface IRepository {
    void Create();
    void Update();
}

И у меня есть 2 отдельных реализации:

class RepositoryFile : interface IRepository {}
class RepositoryDB : interface IRepository {}

Каждый класс имеет совершенно различную внутреннюю реализацию.

Теперь у меня есть другой объект, регистратор, который использует уже созданный репозиторий для записи. Этот объект, не важно, как репозиторий реализован, поэтому он просто реализует:

void WriteLog(string Log, IRepository oRep);

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

Подробнее о различии между абстрактными классами и интерфейсами см. здесь .

-121--1244320-

Вы не создаете экземпляр интерфейса - вы создаете экземпляр того, что реализует интерфейс.

точка интерфейса заключается в том, что он гарантирует, что все, что когда-либо реализовано, обеспечит методы, объявленные в нем.

Итак, теперь, на вашем примере, вы можете иметь:

MyNiftyClass : IMyInterface
{
    public void CallSomeMethod()
    {
        //Do something nifty
    }
}

MyOddClass : IMyInterface
{
    public void CallSomeMethod()
    {
        //Do something odd
    }
}

И теперь у вас есть:

IMyInterface nifty = new MyNiftyClass()
IMyInterface odd = new MyOddClass()

Вызов метода CallSomeMethod теперь будет делать либо что-то ничтожное, либо что-то странное, и это становится особенно полезным, когда вы проходите через IMyInterface в качестве типа.

public void ThisMethodShowsHowItWorks(IMyInterface someObject)
{
    someObject.CallSomeMethod();
}

Теперь, в зависимости от того, вызываете ли вы вышеупомянутый метод с помощью nifty или нечетного класса, вы получаете различное поведение.

public void AnotherClass()
{
    IMyInterface nifty = new MyNiftyClass()
    IMyInterface odd = new MyOddClass()

    // Pass in the nifty class to do something nifty
    this.ThisMethodShowsHowItWorks(nifty);

    // Pass in the odd class to do something odd
    this.ThisMethodShowsHowItWorks(odd);

}

EDIT

Здесь рассматривается, как мне кажется, ваш предполагаемый вопрос - Зачем объявлять переменную интерфейсным типом?

То есть зачем использовать:

IMyInterface foo = new MyConcreteClass();

В пользу:

MyConcreteClass foo = new MyConcreteClass();

Надеюсь, понятно, почему при объявлении сигнатуры метода следует использовать интерфейс, но это оставляет вопрос о переменных локальной области:

public void AMethod()
{
    // Why use this?
    IMyInterface foo = new MyConcreteClass();

    // Why not use this?
    MyConcreteClass bar = new MyConcreteClass();
}

Обычно нет технической причины, по которой интерфейс является предпочтительным. Обычно я использую интерфейс, потому что:

  • я обычно вводу зависимости, так что полиморфизм необходим
  • Используя интерфейс четко указывает мое намерение использовать только члены интерфейса

Одно место, где вы технически необходимо интерфейс, это где вы используете полиморфизм, например, создание вашей переменной с помощью фабрики или (как я сказал выше) с помощью зависимости инъекции.

Заимствование примера из itowlson с помощью конкретного объявления невозможно:

public void AMethod(string input)
{               
    IMyInterface foo;

    if (input == "nifty")
    {
        foo = new MyNiftyClass();
    }
    else
    {
        foo = new MyOddClass();
    }
    foo.CallSomeMethod();
}
-121--1244313-

Вместо (или) остановки IIS остановите службу публикации в Интернете с помощью services.msc и внесите изменения.

Мы обнаружили, что для DLL управления графами, используемой приложением asp.net,Недостаточно просто остановить IIS, так как не удалось удалить файл (или вставить и т. д.). Но как только служба публикации в Интернете была остановлена, ее можно было удалить или перезаписать...

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

Если IIS не является процессом, блокирующим файл, и вы действительно застряли, Unlocker может помочь узнать, что на самом деле блокирует файл, так как а также снятие этих блокировок и принудительное удаление файла.

Получите здесь

0
ответ дан 14 December 2019 в 19:13
поделиться
Другие вопросы по тегам:

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