asp.net中引用vb中的函数

VB中新建一ActioveX,添加类模块,如下内容:

'工程1

Public Function aa(str1)

    For i = 1 To Len(str1)
        c = Asc(Mid(str1, i, 1))

        If c < 0 Then c = c + 65536
       
        If c > 255 Then
            local1 = i
            Exit For
        End If
    Next

    str1 = Left(str1, local1 - 2)
    aa = str1

End Function

'----------------------------------------------------------------'
'    getStrLen
'    获取字符长度,一个中文字符长度算 2
'    参数:
'        str 需要获取长度的字符串
'    返回值:整数 (字符串的长度)
'----------------------------------------------------------------'
Function GetStrLen(str)
    If IsNull(str) Or str = "" Then
        getStrLen = 0
    Else
        Dim i, n, k, chrA
        k = 0
        n = Len(str)
        For i = 1 To n
            chrA = Mid(str, i, 1)
            If Asc(chrA) >= 0 And Asc(chrA) <= 255 Then
                k = k + 1
            Else
                k = k + 2
            End If
        Next
        getStrLen = k
    End If
End Function

生成 ff.dll

------------------------------------------------

regsvr32 ff.dll 注册

------------------------------------------------

asp中引用:

<%
dim aatest
set aatest = server.createobject("工程1.class1")
response.write(aatest.aa("32/a2/第三/fe"))
%>

-------------------------------------------------

asp.net中引用:

引用-〉添加引用->gongcheng

在.cs文件中加入using 工程1;

 

namespace spc
{
 /// <summary>
 /// WebForm1 的摘要说明。
 /// </summary>
 public class WebForm1 : System.Web.UI.Page
 {
  protected System.Web.UI.WebControls.TextBox TextBox1;
  protected System.Web.UI.WebControls.Button Button1;
 
  private void Page_Load(object sender, System.EventArgs e)
  {
   // 在此处放置用户代码以初始化页面
  }

  #region Web 窗体设计器生成的代码
  override protected void OnInit(EventArgs e)
  {
   //
   // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
   //
   InitializeComponent();
   base.OnInit(e);
  }
  
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {   
   this.Button1.Click += new System.EventHandler(this.Button1_Click);
   this.Load += new System.EventHandler(this.Page_Load);

  }
  #endregion

  private void Button1_Click(object sender, System.EventArgs e)
  {
   工程1.Class1Class a = new Class1Class() ;
   object str = (object)this.TextBox1.Text.ToString();
   Response.Write(a.aa(ref (object)str));
  }

 }
}

其中,a.aa(ref (object)this.TextBox1.Text.ToString())提示"ref 或 out 必须是一个lvalue":

昨天写了个关于socket接收udp包的程序,调用了socket.ReceiveFrom方法,发现了一个c#中关于ref和out参数传递时的问题,这里提出来和大家共同探讨一下,首先声明,下面的结论都是本人推测,还没有得到任何定论,若有错误请大家指正。

首先,ReceiveFrom方法的原型为

public int ReceiveFrom(byte[], ref EndPoint);

有一个为ref的EndPoint参数,用它来返回收到包的源地址信息,ref的语义是传引用,即对所传引用的修改可以反映到方法外面。我一般都使用IPEndPoint来表示地址信息,所以很自然的使用了如下的调用方法

(代码1)

IPEndPoint iep = new IPEndPoint(IPAddress.Any,0);

socket.ReceiveFrom(buffer,ref (EndPoint)iep);

这时编译时出现了一下的错误,“ref或out参数必须是一个lvalue”,iep怎么会不是一个左值呢?关键是在调用方法时使用的强制转换(例如(EndPoint)iep),我改了一下代码

(代码2)

IPEndPoint iep = new IPEndPoint(IPAddress.Any,0);

EndPoint ep = (EndPoint)iep;

socket.ReceiveFrom(buffer,ref (EndPoint)iep);

这次通过编译了。为什么在方法调用时会出问题?这里要考虑类型强制转换时的一个细节,强制转换时编译器会先生成一个临时引用,然后再把这个临时引用传给一个和转换类型相同的引用,这个临时引用比较特别——不是一个左值(lvalue),不能被赋值!而使用ref参数的方法一般都要对这个引用做修改,如果直接把这个临时引用传进去当时编译器会抱怨ref或out参数必须是一个lvalue。而代码2首先将这个临时引用赋值到一个常规引用上去,这时这个常规引用便是可以复制的了。

 

使用:
object str = (object)this.TextBox1.Text.ToString();
Response.Write(a.aa(ref (object)str));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值