Я создал dll в VS2008, используя С#. Он был скомпилирован с использованием.Net Framework 2.0. Проект был создан с использованием шаблона библиотеки классов в Visual С#/Windows. Я не знаю, имеет ли это значение, но я пытаюсь использовать полученную dll в классических приложениях asp и asp.net, а не в настольном приложении.
Это было создано с помощью существующего классического кода asp vbscript и переписывания его на С#. Я не очень разбираюсь в создании библиотек DLL, поэтому многое еще нужно изучать. Я искал в Интернете всю помощь в создании этой DLL.
Вот что я сделал до сих пор.
Класс верхнего уровня настроен следующим образом:
using System.Runtime.InteropServices;
using System.EnterpriseServices;
using System;
using System.Text;
using System.Web;
[assembly: ApplicationName("WebFramework")]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationAccessControl(false,
AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent)]
namespace WebFramework
{
[GuidAttribute("AACB678E-2C54-450A-873D-77A5A15BA0E5")]
public class Framework : ServicedComponent
{
//Blah
}
}
Другие классы в проекте являются общедоступными, и все они наследуются от класса Framework. Я не включал директиву GuidAttribute для этих классов, потому что я не знаю, нужно это или нет. Мне они нужны, потому что я буду ссылаться на них из своих классических приложений asp/asp.net.
После того как я скомпилировал свой код, я скопировал три файла; Inter.Scripting.dll, WebFramework.dll и WebFramework.pdb на веб-сервер.
Веб-сервер представляет собой окно Windows 2008 R2 с установленным IIS 7.5.
В командной строке на сервере я запустил программу regsvcs и установил эту сборку и зарегистрировал DLL без каких-либо проблем. Окно команды выглядело так:
E:\inetpub\wwwroot\web\WebFramework>"C:\Windows\Microsoft.NET\Framework\v4.0.30319/regsvcs.exe" /appname:WebFramework /tlb:WebFramework.tlb WebFramework.dll
Microsoft (R) .NET Framework Services Installation Utility Version 4.0.30319.17929 Copyright (C) Microsoft Corporation. All rights reserved.
Installed Assembly:
Assembly: E:\inetpub\wwwroot\web\WebFramework\WebFramework.dll
Application: WebFramework
TypeLib: E:\inetpub\wwwroot\web\WebFramework\WebFramework.tlb
Я проверил приложение "Службы компонентов", и в [Приложениях CN10] появился объект WebFramework. Я также запустил regedit и искал "WebFramework", и нашел свое приложение в Computer\HKEY_CLASSES_ROOT\WebFramework..
Пока я думаю, что все правильно... или не так ли?
Когда я запускаю тестовую классическую страницу asp со следующим кодом, я получаю Error 424 - Object required.
<html>
<head>
<title></title>
</head>
<body>
<script type="text/vbscript">
On Error Resume Next
Dim WebFrame
Set WebFrame = Server.CreateObject("WebFramework.Framework")
Document.Write("<hr>")
Document.Write(Err.Number)
Document.Write(" - ")
Document.Write(Err.Description)
Document.Write("<br><hr>")
</script>
</body>
</html>
Что мне не хватает? Почему страница ASP не может найти DLL?
[Edit] Еще одна вещь, о которой я забыл упомянуть. На странице "Свойства проекта" на вкладке "Сборка" установлен флажок "Регистрация для COM-взаимодействия". Я попытался скомпилировать эту опцию, отмеченную и не отмеченную, и это не имело никакого значения.
Вместо того, чтобы сосредоточиться на своем COM-компоненте, являющемся проблемой, попробуйте изменить свой код ASP на допустимый синтаксис.
<html> <head> <title></title> </head> <body>
<% 'This code will be processed server-side On Error Resume Next Dim WebFrame Set WebFrame = Server.CreateObject("WebFramework.Framework") 'Do we have an error? Display it. If Err.Number <> 0 Then Response.Write("<hr>") Response.Write(Err.Number) Response.Write(" - ") Response.Write(Err.Description) Response.Write("<br><hr>") End If %>
</body> </html>
Почему ошибка Object Not Found
?
Как указано выше, ваш код недействителен, почему?
Использование <script type="text/vbscript">
(обычно runat="server"
требуется для использования серверной части тегов <script>
, но поскольку вы получаете сообщение об ошибке, которое предполагает, что оно обрабатывается ASP. В будущем, хотя я рекомендовал бы использовать <%
и %>
чтобы отличить обработку на стороне сервера.
Если вы не создаете экземпляр в другом месте, то нет такого объекта ASP, который называется Document
. Если бы я догадался, я бы сказал, что вы пытаетесь вывести на экран. Для этого используйте встроенный объект Response
(запрос на стороне сервера состоит из Request
и Response
).
Я бы сказал, что ваш Object Not Found
потому что ASP не понимает, что такое Document
, и, следовательно, вызывает ошибку Object Not Found
.
Обновить
После прочтения вашего комментария я понял, что ваш код интерпретируется на стороне клиента, и поэтому
Document.Write
не вызовет ошибкуObject Not Found
Думаю, теперь проблема вServer.CreateObject
потому что это синтаксис на стороне сервера с клиентской стороны.VBScript
не будет Понимаю.
Я выхожу на огромную конечность и отвечаю на этот вопрос, прежде чем у меня будет разрешение. Я думаю, что моя проблема не имеет ничего общего с dll, а скорее с тем, как IIS и этот новый веб-сервер настроены.
Я задал еще один вопрос: IIS 7.5 работает с классическим ASP, что касается правильной настройки сервера и IIS.
Пока им не повезло, но если я даже не могу получить простой клиентский сценарий Hello World для отображения Hello World на веб-странице, то как я мог подумать, что я мог бы создать там объект dll.
Если я решаю первую проблему, и у меня все еще есть проблемы с использованием dll, я вернусь к ней и повторю попытку.