Как я могу использовать DLL из GAC внутри веб-контроля пользователя - PullRequest
1 голос
/ 03 августа 2011

На самом деле моя цель:

  1. Создать веб-сервис asp.net (пространство имен ws, класс Service1)
  2. Создать dll из веб-сервиса
  3. Установить эту dllв GAC
  4. Создание веб-приложения ASP.NET
  5. Не добавляйте ссылку на эту dll в GAC
  6. Создание пользовательского веб-элемента управления без кода в файле
  7. Записать код внутри веб-элемента управления пользователя для использования созданной выше веб-службы (без ссылки на приложение)

Вопрос:

  1. Может ли Интернетприложение ищет сборку внутри GAC, даже если сборка не была привязана к приложению
  2. Могу ли я использовать этот пользовательский веб-элемент управления (в этой ситуации UC не будет скомпилирован, поскольку он не связан с кодом) в других проектахкак WebParts?

PS: Моя последняя ситуация: Service1.asmx.cs:

using System.Web.Services;

namespace ws
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

WebUserControl1.ascx:

<%@ Control Language="C#" ClassName="wuc" %>

<script runat="server">
    protected override void CreateChildControls()
    {
        base.CreateChildControls();
        ws.Service1 srv = new ws.Service1();
        btn.Text = srv.HelloWorld();

    }
</script>

<asp:Button runat="server" ID="btn" Text="asdasd" />

Default.aspx:

...
<%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>
...
    <form id="form1" runat="server">
    <div>    
        <uc1:WebUserControl1 ID="WebUserControl11" runat="server" />    
    </div>
    </form>
...

Я скомпилировал и на этой странице появилась ошибкаили: enter image description here

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Моя цель:

  1. Создание веб-службы asp.net (пространство имен ws, класс Service1)
  2. Создание dll из веб-сервиса
  3. Установите эту DLL в GAC

Aaaaaaahhhhhh!

Зачем вам нужно устанавливать сборки в GAC во время выполнения ?! Ничего хорошего из этого не выйдет!

Да, ответ на оба ваших вопроса стоит того: вы можете либо загрузить сборку самостоятельно, либо напрямую, используя что-то вроде Assembly.Load , либо косвенно (например, создать страницу, которая пытается загрузить тип с использованием имени типа, указанного в сборке.

0 голосов
/ 04 августа 2011

Я узнал и опубликовал в мой блог .

Сначала нам нужно сгенерировать dll из веб-сервиса:

@SET WSDL="c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\wsdl.exe"
%WSDL% /language:cs /out:c:\temp\servis.cs http://localhost:85/WebService1.asmx?WSDL

Мы развернем dll нашего веб-сервиса в GAC.Так что нам нужен файл snk.Мы создадим файл dll из нашего cs, но прежде чем нам нужно будет создать snk.

@SET SN="c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\sn.exe"
%SN% -k c:\temp\servis.snk

Теперь мы можем сгенерировать dll из файла cs

@SET CSC="c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe"
%CSC% /target:library /out:c:\temp\servis.dll c:\temp\servis.cs /keyfile:C:\temp\servis.snk

Теперь мы можем развернуть эту dll в GAC

@SET GACUTIL="c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe"
%GACUTIL% -if c:\temp\servis.dll

Мы можем узнать полное имя нашей dll в файле GAC

%GACUTIL% /l servis.dll

в .ascx, мы можем записать эти строки внутри в script runat=server tag

string sFullName = "servis, version=1.0.0.0 publickeytoken=asdhfasdfjk2323"
string sClass = "Service1"
object instance = Activator.CreateInstance(sFullName, sClass).Unwrap();
Type tip = instance.GetType();
MethodInfo mi = tip.GetMethod("HelloWorld");
object result =  mi.Invoke(instance,null);
string sResult = result.ToString();
...