如何在Web用户控件中使用GAC中的dll

时间:2011-08-03 09:14:41

标签: asp.net assemblies web-parts gac

其实我的目标是;

  1. 创建asp.net Web服务(名称空间ws,类Service1)
  2. 从网络服务创建dll
  3. 将此dll安装到GAC
  4. 创建ASP.NET Web应用程序
  5. 请勿在GAC中添加此dll的引用
  6. 创建Web用户控件,文件后面没有任何代码
  7. 在Web用户控件中编写代码以使用Web服务 上面创建的(不提供申请)
  8. 问题是;

    1. 即使是,网络应用程序也可以在GAC内部搜索程序集 程序集没有引用应用程序
    2. 我可以使用此网页吗? 用户控制(在这种情况下UC不会被编译,因为它不是 在像WebParts这样的其他项目中有代码吗?
    3. 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 个答案:

答案 0 :(得分:2)

  

我的目标是;

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

Aaaaaaahhhhhh!

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

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

答案 1 :(得分:0)

我已经学习并发布到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

我们将把我们的webservice的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();