如何从VB.Net调用C#类的静态方法?

编程入门 行业动态 更新时间:2024-10-26 09:34:44
本文介绍了如何从VB.Net调用C#类的静态方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 我有一个C#DLL,想在VB.NET中使用它。我正在使用C#2008 Express和VB 2008 Express。我在VB项目中添加了一个引用到C#dll。当我在C#dll中创建一个类的实体时,它会产生以下错误消息:TypeRF.RabinFingerprint没有构造函数。如何解决这个问题?

我的C#dll代码:

使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用System.Text; 命名空间RF { ///< summary> ///Génèredes empreintes de fichiers ///< / summary> public static class RabinFingerprint { ///< summary> ///多项式P的位64始终为1,不被直接处理。这是多项式 ///,导数系数被去除(lcr)。 ///表示t ^ 64 + t ^ 4 + t ^ 3 + t + 1 ///< / summary> private static readonly UInt64 p_lcr = 0x000000000000001BL; ///< summary> ///只要不使用 ///地址,就不必为这样的整型常量变量提供定义。 ///多项式P.的度数 ///< / summary> private static readonly int K = 64; ///< summary> ///表示t ^(K-1) ///< / summary> private static readonly UInt64 T_K_minus_1 =(UInt64)1L < (K-1); ///< summary> /// Broder的论文提出了四个预先计算的表,因为单词被认为是32位。 ///在这个实现中,W是一个64位整数类型。使用八个表。 ///表A是i1 ^ 127 + i2 ^ 126 + ... + i8 ^ 120。 ///表B是i1 ^ 119 + i2 ^ 118 + ... + i8 ^ 112。 ///表C,D,.. ///表E是i1 ^ 95 + i2 ^ 94 + ... + i8 ^ 88。 (这是本文中的表A) ///表F,G,H. ///< / summary> private static UInt64 [] tableA_ = new UInt64 [256]; //假设字节大小8. private static UInt64 [] tableB_ = new UInt64 [256]; private static UInt64 [] tableC_ = new UInt64 [256]; private static UInt64 [] tableD_ = new UInt64 [256]; private static UInt64 [] tableE_ = new UInt64 [256]; private static UInt64 [] tableF_ = new UInt64 [256]; private static UInt64 [] tableG_ = new UInt64 [256]; private static UInt64 [] tableH_ = new UInt64 [256]; ///< summary> ///构造函数 ///< / summary> static RabinFingerprint() { InitTables(); } ///< summary> ///初始化表 ///< / summary> private static void InitTables() { //这表示t ^(k + i)mod P,其中i是数组的索引。 //将用于计算表。 UInt64 [] mods = new UInt64 [K]; //记住t ^ k mod P等价于p_lcr。 mods [0] = p_lcr; (int i = 1; i< K; ++ i) { //通过属性:t ^ i mod P = t(t ^(i-1)) mod P. mods [i] = mods [i-1]<< 1; //如果mods [i-1]在k-1处有一个项,则mods [i]将具有未被表示的项k。 //这个术语k将再次被P除以P.然后,效果与将p_lcr添加到mod相同的 //。 if((mods [i-1]& T_K_minus_1)!= 0) mods [i] ^ = p_lcr; } //计算表。控制变量用于指示当前位是否应为 //。 (int i = 0; i gt; 56)& 0xFF)]; 返回值; //通过引用返回相同的w。 (便利和效率)} ///< summary> /// Compute hask hey ///< / summary> ///< param name =HashArray> Ulong数组到ahsh< / param> ///< returns>哈希键< / returns> private static UInt64 Compute(UInt64 [] HashArray) { UInt64 w = 0L; for(int s = 0; s< HashArray.Length; ++ s) w = ComputeTablesSum(ref w)^ HashArray [s]; return w; } ///< summary> ///计算指纹 ///< / summary> ///< param name =source>要计算的字符串< / param> ///< returns>哈希键< / returns> public static UInt64 ComputeFingerPrint(string source) { byte [] table = Encoding.Unicode.GetBytes(source); UInt64 [] values = new UInt64 [table.LongLength]; ConvertBytes(ref表,ref值); return Compute(values); } ///< summary> ///计算指纹,必须使用这种方法来获取非常大的文本 ///< / summary> ///< param name =source>要计算的字符串< / param> ///< returns>哈希键< / returns> public static UInt64 ComputeFingerPrint(ref string source) { return ComputeFingerPrint(source); } ///< summary> ///计算指纹,必须使用这种方法来获取非常大的二进制数据 ///< / summary> ///< param name =source>要计算的数据< / param> ///< returns>散列键< / returns> public static UInt64 ComputeFingerPrint(ref byte [] source) { UInt64 [] values = new UInt64 [source.LongLength]; ConvertBytes(ref source,ref values); return Compute(values); } ///< summary> ///计算指纹,必须使用这种方法来获取非常大的二进制数据 ///< / summary> ///< param name =source>要计算的数据< / param> ///< returns>哈希键< / returns> public static UInt64 ComputeFingerPrint(byte [] source) { return ComputeFingerPrint(ref source); } ///< summary> ///将字节数组计算到Uint64数组 ///< / summary> ///< param name =source>表de字节源< / param> ///< param name =destination> Tableau de Uin64< / param> private static void ConvertBytes(ref byte [] source,ref UInt64 [] destination) { for(long i = 0; i< source.LongLength; i ++) destination [i] = Convert.ToUInt64(source [i]); } } }

我的VB代码: p>

导入RF 模块Module1 Sub Main() Dim t As New RabinFingerprint End Sub 结束模块

解决方案

如果要使用实例,则需要向C#类添加一个非静态构造函数 - 目前只有一个静态构造函数。 >

有关于VB.Net和C#中静态/共享之间差异的信息这里,这可能对解决这个有用。

如果你在C#中这样做,你只需调用类的静态方法,如

UInt64 result = RabinFingerprint.ComputeFIngerprint(...);

等。

在VB.Net中,这看起来像这样:

Dim result = RF.RabinFingerprint.ComputeFingerprint(...)

这里是我的意思是 MSDN 示例。这两个 Console.WriteLine 和 Regex.Split 是静态的,就像你的类的方法一样。

Dim input As String =plum-pear Dim pattern As String = - 'Split在连字符上 Dim substrings()As String = Regex.Split(input,pattern)对于每个匹配As String在子串中 Console.WriteLine('{0}' ,match) Next '该方法将以下内容写入控制台:''plum''''''pear'

I have a C# dll and want to use it in VB.NET. I'm using C# 2008 Express and VB 2008 Express. I have added a reference in a VB project to the C# dll. When I create an instane of a class in the C# dll, it gives the following error messsage: "Type 'RF.RabinFingerprint' has no constructors". How do I fix this?

My C# dll code:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RF { /// <summary> /// Génère des empreintes de fichiers /// </summary> public static class RabinFingerprint { /// <summary> /// Bit 64 of the polynomial P is always 1 and not treated directly. This is the polynomial /// with the leading coefficient removed (lcr). /// Represents t^64 + t^4 + t^3 + t + 1. /// </summary> private static readonly UInt64 p_lcr = 0x000000000000001BL; /// <summary> /// It's not necessary to provide definitions for such integral constant variables as long as their /// addresses are not taken. /// Degree of the polynomial P. /// </summary> private static readonly int K = 64; /// <summary> /// Represents t^(K-1) /// </summary> private static readonly UInt64 T_K_minus_1 = (UInt64)1L << (K - 1); /// <summary> /// Broder's paper presents four pre-computed tables because words are considered to be 32-bit. /// In this implementation W is a 64-bit integral type. Eight tables are used. /// Table A is i1^127 + i2^126 + ... + i8^120. /// Table B is i1^119 + i2^118 + ... + i8^112. /// Table C, D, .. /// Table E is i1^95 + i2^94 + ... + i8^88. (This is table A in the paper.) /// Table F, G, H. /// </summary> private static UInt64[] tableA_ = new UInt64[256]; //Assuming byte size 8. private static UInt64[] tableB_ = new UInt64[256]; private static UInt64[] tableC_ = new UInt64[256]; private static UInt64[] tableD_ = new UInt64[256]; private static UInt64[] tableE_ = new UInt64[256]; private static UInt64[] tableF_ = new UInt64[256]; private static UInt64[] tableG_ = new UInt64[256]; private static UInt64[] tableH_ = new UInt64[256]; /// <summary> /// Constructor /// </summary> static RabinFingerprint() { InitTables(); } /// <summary> /// Initialize tables /// </summary> private static void InitTables() { //This represents t^(k + i) mod P, where i is the index of the array. //It will be used to compute the tables. UInt64[] mods = new UInt64[K]; //Remember t^k mod P is equivalent to p_lcr. mods[0] = p_lcr; for (int i = 1; i < K; ++i) { //By property: t^i mod P = t(t^(i - 1)) mod P. mods[i] = mods[i - 1] << 1; //If mods[i - 1] had a term at k-1, mods[i] would have had the term k, which is not represented. //The term k would account for exactly one more division by P. Then, the effect is the same //as adding p_lcr to the mod. if ((mods[i - 1] & T_K_minus_1) != 0) mods[i] ^= p_lcr; } //Compute tables. A control variable is used to indicate whether the current bit should be //considered. for (int i = 0; i < 256; ++i) { int control = i; for (int j = 0; j < 8 && control > 0; ++j) { // bool.Parse(Convert.ToString()) if ((control & 1) == 1) //Ok, consider bit. ((byte)) { tableA_[i] ^= mods[j + 56]; tableB_[i] ^= mods[j + 48]; tableC_[i] ^= mods[j + 40]; tableD_[i] ^= mods[j + 32]; tableE_[i] ^= mods[j + 24]; tableF_[i] ^= mods[j + 16]; tableG_[i] ^= mods[j + 8]; tableH_[i] ^= mods[j]; } control >>= 1; } } } /// <summary> /// Compute hash key /// </summary> /// <param name="value">Value to hash</param> /// <returns>Value</returns> private static UInt64 ComputeTablesSum(ref UInt64 value) { value = tableH_[((value) & 0xFF)] ^ tableG_[((value >> 8) & 0xFF)] ^ tableF_[((value >> 16) & 0xFF)] ^ tableE_[((value >> 24) & 0xFF)] ^ tableD_[((value >> 32) & 0xFF)] ^ tableC_[((value >> 40) & 0xFF)] ^ tableB_[((value >> 48) & 0xFF)] ^ tableA_[((value >> 56) & 0xFF)]; return value; //Pass by reference to return the same w. (Convenience and efficiency.) } /// <summary> /// Compute hask hey /// </summary> /// <param name="HashArray">Array of Ulong bytes to ahsh</param> /// <returns>Hash key</returns> private static UInt64 Compute(UInt64[] HashArray) { UInt64 w = 0L; for (int s = 0; s < HashArray.Length; ++s) w = ComputeTablesSum(ref w) ^ HashArray[s]; return w; } /// <summary> /// Compute the fingerprint /// </summary> /// <param name="source">String to compute</param> /// <returns>Hash key</returns> public static UInt64 ComputeFingerPrint(string source) { byte[] table = Encoding.Unicode.GetBytes(source); UInt64[] values = new UInt64[table.LongLength]; ConvertBytes(ref table, ref values); return Compute(values); } /// <summary> /// Compute the fingerprint, you must use this method for very large text /// </summary> /// <param name="source">String to compute</param> /// <returns>Hash key</returns> public static UInt64 ComputeFingerPrint(ref string source) { return ComputeFingerPrint(source); } /// <summary> /// Compute the fingerprint, you must use this method for very large binary data /// </summary> /// <param name="source">Data to compute</param> /// <returns>Hash key</returns> public static UInt64 ComputeFingerPrint(ref byte[] source) { UInt64[] values = new UInt64[source.LongLength]; ConvertBytes(ref source, ref values); return Compute(values); } /// <summary> /// Compute the fingerprint, you must use this method for very large binary data /// </summary> /// <param name="source">Data to compute</param> /// <returns>Hash key</returns> public static UInt64 ComputeFingerPrint(byte[] source) { return ComputeFingerPrint(ref source); } /// <summary> /// Compute byte array to Uint64 array /// </summary> /// <param name="source">Table de byte source</param> /// <param name="destination">Tableau de Uin64</param> private static void ConvertBytes(ref byte[] source, ref UInt64[] destination) { for (long i = 0; i < source.LongLength; i++) destination[i] = Convert.ToUInt64(source[i]); } } }

My VB code:

Imports RF Module Module1 Sub Main() Dim t As New RabinFingerprint End Sub End Module

解决方案

If you want to use instances, you need to add a non-static constructor to the C# class - currently it's only got a static constructor.

There is info on diffs between static/shared in VB.Net and C# here that could be useful in resolving this.

If you were doing this in C# you just call the class's static methods like

UInt64 result = RabinFingerprint.ComputeFIngerprint(...);

etc.

In VB.Net this looks something like this:

Dim result = RF.RabinFingerprint.ComputeFingerprint(...)

Here is an example from MSDN of what I mean. Here both Console.WriteLine and Regex.Split are static, just like your class's methods.

Dim input As String = "plum--pear" Dim pattern As String = "-" ' Split on hyphens Dim substrings() As String = Regex.Split(input, pattern) For Each match As String In substrings Console.WriteLine("'{0}'", match) Next ' The method writes the following to the console: ' 'plum' ' '' ' 'pear'

更多推荐

如何从VB.Net调用C#类的静态方法?

本文发布于:2023-06-11 23:33:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/645324.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:静态   方法   VB   Net

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!