关闭

asp.net中引用vb中的函数

1002人阅读 评论(0) 收藏 举报

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

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6323次
    • 积分:138
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    最新评论