Я следовал за направлениями здесь: 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 снова.
Что касается DLL, вам придется остановить IIS, удалить их, затем начать IIS. Это потому, что они родные DLL, а не C # DLL's. C # Функция «Shadow Copy» не распространяется на нативную DLL, поэтому они заблокированы.
Что касается Oracle, я по электронной почте вам несколько вещей, чтобы попробовать ... Действительно, мы должны обновить эту страницу, когда вы найдете решение.
Целью интерфейса является определение контракта между несколькими объектами, независимо от конкретной реализации.
Поэтому его обычно используют при наличии 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, так как не удалось удалить файл (или вставить и т. д.). Но как только служба публикации в Интернете была остановлена, ее можно было удалить или перезаписать...
Если IIS не является процессом, блокирующим файл, и вы действительно застряли, Unlocker может помочь узнать, что на самом деле блокирует файл, так как а также снятие этих блокировок и принудительное удаление файла.
Получите здесь