【问题标题】:COM object only works in VB.NET not C#COM 对象仅适用于 VB.NET 而不是 C#
【发布时间】:2011-08-22 12:07:50
【问题描述】:

我有一个在 VB.NET 中可以正常工作的 COM 对象,但在 C# 中却不行。这两个项目都是 .NET 4 控制台应用程序。

COM 对象在 C# 中加载,但方法不返回任何值。为什么它可以在 VB.NET 而不是 C# 中工作?

谢谢!

Sub Main()
    Dim server As New NoahVersionLib.Version

    Dim val As Int32

    server.GetNoahServerVersionMS(val)



End Sub


    static void Main(string[] args)
    {
        var server = new NoahVersionLib.Version();

        int val= 0;

        server.GetNoahServerVersionMS(ref val);
    }

val 在 C# 构建中为 0,但在 VB.NET 构建中具有值。

更新:
我需要将 [STAThread] 放在 C# 中的 Main() 上。现在可以了。

【问题讨论】:

  • 代码?还是我们在猜测..?
  • 请展示一个最小但工作(即编译)的代码示例,说明两个环境中的问题。 tinyurl.com/so-hints
  • 它只能在 VB.NET 而不是 C# 中工作,没有什么特别的原因。它们编译成相同的代码。我们可以回答这个问题的唯一方法是,如果您向我们提供重现行为的最小样本。很有可能,您将 VB.NET 代码转换为 C# 的方式存在错误。
  • 查看ildasm 中的两个exe 文件。你看到生成的 IL 代码有什么不同吗?如果是,是什么?
  • 另外,如果使用 var 而不是 NoadVersionLib.Version,它会在 C# 构建中产生差异。

标签: c# .net vb.net com interop


【解决方案1】:

我需要将 [STAThread] 放在 C# 中的 Main() 上。现在可以了。

【讨论】:

    【解决方案2】:

    您是否在 C# 中尝试过以下操作?

    static void Main(string[] args)    
    {        
        NoahVersionLib.Version server = new NoahVersionLib.Version();        
        Int32 val= 0;        
        server.GetNoahServerVersionMS(ref val);    
    }
    

    您的 2 个版本之间的唯一区别是您使用 var 而不是声明实际类型,从而允许编译器潜在地推断出不正确的类型(不太可能,但肯定有可能);并使用int 而不是Int32。据我所知,int == Int32,但可能在 COM 的一些奇怪的极端情况下,它可能不是..?

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2021-07-24
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多