C# Com Interop 类的方法在 VB6 中不可见?

3
我在.NET中创建了一个C# Com Interop类,并且已经在我的开发机器上适当地注册了它,同时在程序集中将Com-Visible设置为true。但是,当我在VB6应用程序中引用库时,我能够看到库名称、类名称,但没有与它们相关联的任何方法或属性?
如果有人能帮我解决这个问题,我已经卡了很长时间了!
这是我的类:
using System;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace VNDBUtils
{
public enum VNConstants : long
{
    cenMySQLDataStore = 32
}

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("CF4EFB82-6EE1-4A84-9CA9-07B135888B68")]
[ComVisible(true)]
public interface IVNSqlFormatter
{
    //Properties
    long DS_Type { get; set; }
    string DS_Query { get; set; }

    //Methods
    string Format_Entity(string strString);
    string MqStrMan_MakeStringEndWith(string strString, string strMatch);
    bool MqStrMan_StringEndsWith(string strString, string strMatch);
    string MqStrMan_MakeStringStartWith(string strString, string StrMatch);
    bool MqStrMan_StringStartsWith(string strString, string strMatch);
    string Right(string value, int length);
    string Left(string value, int maxLength);
    string Format_Value(string strString);
}



[ClassInterface(ClassInterfaceType.None)]
[Guid("3884D59D-AB76-41E7-82B6-21C66DBDCBF3")]
[ComVisible(true)]
public class VNSqlFormatter : IVNSqlFormatter
{

    private const string SQUARE_LEFT = "[";
    private const string SQUARE_RIGHT = "]";

    public long DS_Type { get; set; }
    public string DS_Query { get; set; }

    public string Format_Entity(string strString)
    {           
        strString = strString.Trim();

        if (DS_Type == (long)VNConstants.cenMySQLDataStore)
        {
            return strString;
        }
        else
        {
            return MqStrMan_MakeStringEndWith(MqStrMan_MakeStringStartWith(strString, SQUARE_LEFT), SQUARE_RIGHT);
        }

    }

    public string MqStrMan_MakeStringEndWith(string strString, string strMatch)
    {
        if (MqStrMan_StringEndsWith(strString, strMatch) == false)
        {
            return strString + strMatch;
        }
        else
        {
            return strString; 
        }

    }

    public bool MqStrMan_StringEndsWith(string strString, string strMatch)
    {
        return String.Equals(Right(strString, strMatch.Length), strMatch);

    }

    public string MqStrMan_MakeStringStartWith(string strString, string strMatch)
    {
        if (MqStrMan_StringStartsWith(strString, strMatch) == false)
        {
            return strMatch + strString;
        }
        else
        {
            return strString; 
        }
    }

    public bool MqStrMan_StringStartsWith(string strString, string strMatch)
    {
       return String.Equals(Left(strString, strMatch.Length), strMatch);
    }

    public string Right(string value, int length)
    {
        if (String.IsNullOrEmpty(value))
        {
            return String.Empty;
        }

        return value.Length <= length ? value : value.Substring(value.Length - length);
    }

    public string Left(string value, int maxLength)
    {
        if(String.IsNullOrEmpty(value))
        {
            return String.Empty; 
        }

        maxLength = Math.Abs(maxLength);
        return value.Length <= maxLength ? value : value.Substring(0, maxLength);
    }

    public string Format_Value(string strString)
    {
            return strString.Replace("'", "''");
    }

}

}


1
在类上没有看到ProgId属性,即ProgId("VNDBUtils.VNSqlFormatter")。这可能是问题,也可能不是,我知道我所有的COM互操作类都有一个。 - Der Kommissar
我不知道是否必要,我会尝试并回复你。谢谢你的提示! - ChewyMasta
另外,.tlib 文件是否已生成? - Der Kommissar
是的,我认为问题出在ProgId上,因为现在它似乎运行正常!谢谢 :) - 我没有足够的声望来点赞,但如果可以的话,我会的。 - ChewyMasta
没问题,我会将其添加为答案,这样我们就可以将其从队列中移除了。 - Der Kommissar
3个回答

5

在评论中的讨论引出了以下问题,ProgId属性未设置。

[ClassInterface(ClassInterfaceType.None)]
[Guid("3884D59D-AB76-41E7-82B6-21C66DBDCBF3")]
[ComVisible(true)]
[ProgId("VNDBUtils.VNSqlFormatter")]
public class VNSqlFormatter : IVNSqlFormatter
{
    /* implementation information */
}

2
你编辑了AssemblyInfo.cs文件吗?
通常情况下,这是默认设置:
// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("e2e2a417-bd3d-414d-97f9-91196ce1c63a")]

你需要将 [assembly: ComVisible(false)] 设置为 true


是的,我已将其设置为true。 - ChewyMasta

0

我觉得这段文字太长了,不适合作为 其他答案 的评论。

ProgID应该是自动生成的。而且看起来它已经被生成为你手动添加的相同字符串了。

根据Microsoft文档汇编到类型库转换摘要-导出类型转换:

导出过程还通过结合命名空间和类型名称自动生成程序标识符(ProgId)。例如,对于前面示例中显示的托管LinkedList类生成的ProgId为A.B.LinkedList。

结合命名空间和类型名称可能会导致无效的ProgId。 ProgId仅限于39个字符,其中不能包含除句点以外的任何标点符号字符。 为避免这些限制,您可以在源代码中使用ProgIdAttribute指定ProgId,而不是允许导出进程为您生成标识符。

如果你仅仅是为了测试而删除ProgID属性,那么你可以检查编译时所创建的类型库(使用类似OleView的工具),并查看它生成的ProgID。也许它会生成一个VB6无效的ProgID,尽管从你提供的代码来看,这似乎不太可能发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接