我在.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("'", "''");
}
}
}
答案 0 :(得分: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
。
答案 1 :(得分:2)
评论中的讨论导致以下内容,ProgId
属性未设置。
[ClassInterface(ClassInterfaceType.None)]
[Guid("3884D59D-AB76-41E7-82B6-21C66DBDCBF3")]
[ComVisible(true)]
[ProgId("VNDBUtils.VNSqlFormatter")]
public class VNSqlFormatter : IVNSqlFormatter
{
/* implementation information */
}
答案 2 :(得分:0)
认为这太长了,无法添加评论other answer。
应自动生成ProgID。它似乎应该已经生成为您手动添加的相同字符串。
根据Microsoft文档 Assembly to Type Library Conversion Summary - Exported Type Conversion:
导出过程还会自动生成程序化 标识符(ProgId)通过组合命名空间和类型名称。对于 例如,显示为托管的LinkedList类生成的ProgId 在前面的例子中是A.B.LinkedList。
组合命名空间 和类型名称可能导致ProgId无效。 ProgId仅限于 39个字符,除了以外不能包含标点字符 周期。要避免这些限制,您可以在您的指定中指定ProgId 源代码通过应用ProgIdAttribute,而不是允许 导出过程为您生成标识符。
如果您将ProgID属性作为测试取出,则可以检查在编译时创建的类型库(使用OleView等工具)并查看它生成的ProgID。也许它有可能生成一个对VB6无效的ProgID,尽管从你的例子中的代码看起来似乎不是这样。