【问题标题】:Need a working example of a C# class used in VB.NET需要一个在 VB.NET 中使用的 C# 类的工作示例
【发布时间】:2010-10-29 14:23:52
【问题描述】:

谁能给我一个可以编译为 DLL 的 C# 类的简短工作示例,以及一个基于该类创建对象并使用其成员(方法)的 VB.NET 代码示例。 C# 类必须有一个命名空间、至少一个类定义(显然)和一些方法或它们应该被调用的任何东西。我有别人的 C#-DLL 代码,但在我的 VB 项目中看不到它的成员。我知道我必须在我的 VB.NET 项目中引用 DLL。我正在使用 VB.NET Express 2008 和 C# 2008 Express。

【问题讨论】:

  • 你有密码吗?还是只是 DLL?
  • 这不是抄袭,而是stackoverflow.com/questions/4044032/…的跟进
  • 它应该可以正常工作,您需要更具体地了解哪些 DLL 和/或哪些成员您看不到。你怎么能不“看到”他们呢?在对象浏览器中,智能感知还是什么?
  • @WernerCD:我有代码并使用 C# Express 2008 构建了 DLL。
  • @Steve Townsend:没错,但我卡住了,我想我在这方面对 C# 和 VB.NET 的了解还不够。

标签: c# vb.net dll


【解决方案1】:

--foo.cs

namespace Sharp
{
    public class Foo
    {
        public string Message
        {
            get { return "This is from CSharp"; }
        }
    }
}

--bar.vb

Namespace bartest
   Public Class Bar

     Public Shared Sub Main()
        Dim test as Sharp.Foo
        test = New Sharp.Foo()
        Console.WriteLine(test.Message)

     End Sub

  End Class
End Namespace

--要编译的批处理文件

%WINDIR%\Microsoft.NET\Framework\v3.5\csc.exe /target:library foo.cs 
%WINDIR%\Microsoft.NET\Framework\v3.5\vbc.exe bar.vb /reference:foo.dll

--运行bar.exe

【讨论】:

  • +1 用于提供运行测试所需的一切,甚至包括批处理编译命令。太棒了。
  • 感谢您的回答,确实很有帮助。
【解决方案2】:

托管程序集(DLL 和 EXE)不是“C#”或“VB.NET”或任何其他语言。

它们是带有CIL 的 .NET 程序集,应该与任何 .NET 语言互操作。

在项目中引用此类程序集后,您就可以访问其中的所有公共类型。

如果您看不到任何成员,请确保它们确实被声明为 public,因为 C# 在大多数成员上默认为 internalprivate

详细了解 C# 中的访问修饰符here

【讨论】:

    【解决方案3】:

    我的猜测是,您尝试访问的成员只是没有声明为 public,因此它们不能跨命名空间使用。

    如果您想要一个工作示例,只需创建一个新解决方案并按照以下步骤操作。

    1. 添加 VB.net 代码项目
    2. 添加一个公共类。
    3. 添加 C# 代码项目。
    4. 添加一个简单的 C# 类。

    当您完成此设置后,只需从一个项目对另一个项目进行项目引用,然后尝试在其中一个创建的类中调用它。

    只要成员声明为 public 或命名空间相同且成员声明为 internal,您就可以对任何 .Net dll 执行此操作。

    【讨论】:

      【解决方案4】:

      这是一个工作示例 - 我必须在 C# 代码中重命名您的一些 ComputeFingerprint 重载,以使 VB.Net 正确识别您想要调用的特定。也许这些是您在上面提到的无法解决的错误?

      C#代码:

      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 ComputeFingerPrint2(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 ComputeFingerPrint3(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 ComputeFingerPrint4(byte[] source)
              {
                  return ComputeFingerPrint3(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]);
              }
          }
      }
      

      VB.Net 代码(已测试,结果 = 8533825001260623604):

      Imports RF
      
      Module Module1
      
          Sub Main()
      
              Dim input = "this is the string"
              Dim result = RF.RabinFingerprint.ComputeFingerprint(input)
      
          End Sub
      
      End Module
      

      【讨论】:

      • 史蒂夫,非常感谢您的帮助。我想让你知道上面的代码对我有用。我希望你不介意我选择爸爸的答案作为这个问题的“最佳”答案,尽管你的答案也可以。
      【解决方案5】:

      a C# to VB Converter 这样的东西会起作用吗?如果您有代码,并且对 VB 很熟悉...在 VB 中工作。

      This blog 有一个在步骤 2 中使用 C# 作为类库的示例。还有一个示例应用程序。

      【讨论】:

      • 我尝试将其转换为 VB,但出现了一些我无法解决的错误。但是请忘记那个 DLL,请给我一个实际工作的简短示例。从那里我也许能够解决我真正的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多