【问题标题】:How can I use a dll from GAC inside Web User Control如何在 Web 用户控件中使用 GAC 中的 dll
【发布时间】:2011-10-18 22:38:37
【问题描述】:

其实我的目标是;

  1. 创建 asp.net Web 服务(命名空间 ws,Service1 类)
  2. 从 Web 服务创建 dll
  3. 将此 dll 安装到 GAC
  4. 创建 ASP.NET Web 应用程序
  5. 不要在 GAC 中为此 dll 添加引用
  6. 在文件后面没有任何代码的情况下创建 Web 用户控件
  7. 在 Web 用户控件中编写代码以使用 Web 服务 在上面创建(未提及应用程序)

问题是;

  1. Web 应用程序是否可以在 GAC 中搜索程序集,即使 程序集未引用到应用程序
  2. 我可以使用这个网站吗 用户控制(在这种情况下 UC 不会被编译,因为它不是 代码隐藏)在其他项目(如 WebParts)中?

PS:我最后的情况: 服务1.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" />

默认.aspx:

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

我编译后网页出现了这个错误:

【问题讨论】:

    标签: asp.net assemblies web-parts gac


    【解决方案1】:

    我的目标是;

    1. 创建 asp.net Web 服务(命名空间 ws,Service1 类)
    2. 从 Web 服务创建 dll
    3. 将此 dll 安装到 GAC

    啊啊啊啊啊啊!

    为什么需要在运行时将程序集安装到 GAC?!这样做没有好处!

    对于这两个问题的答案是肯定的 - 您可以自己加载程序集,或者直接使用 Assembly.Load 之类的东西,或者间接通过(例如)创建一个页面来尝试使用程序集限定类型名称。

    【讨论】:

      【解决方案2】:

      我已经学习并发布到my blog

      首先我们需要从webservice生成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文件。我们将从我们的 cs 中创建 dll 文件,但在我们需要创建 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
      

      现在我们可以从cs文件生成dll了

      @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
      

      我们可以在 GAC 中了解我们的 dll 的 FullName

      %GACUTIL% /l servis.dll
      

      在 .ascx 文件中,我们可以将这些行写入 script runat=server 标记

      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();
      

      【讨论】:

        猜你喜欢
        • 2010-11-07
        • 2011-10-19
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 2011-05-20
        • 2010-10-01
        相关资源
        最近更新 更多