Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#COM对象VBA函数或接口标记为受限,或该函数使用不支持的自动化类型_C#_Vba_Com_Ms Word - Fatal编程技术网

C#COM对象VBA函数或接口标记为受限,或该函数使用不支持的自动化类型

C#COM对象VBA函数或接口标记为受限,或该函数使用不支持的自动化类型,c#,vba,com,ms-word,C#,Vba,Com,Ms Word,我有以下C#COM对象: [ComVisible(true), GuidAttribute("FD87D0EA-1D00-4189-801A-987D5F8ABD2C")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IRegistration { string RegisterForm(string server, string database, string username, str

我有以下C#COM对象:

[ComVisible(true), GuidAttribute("FD87D0EA-1D00-4189-801A-987D5F8ABD2C")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IRegistration
{
    string RegisterForm(string server, string database, string username, string password, string catalogId, string date, string AxyaContextFile);
    void RegisterFormAcknowledge(string server, string database, string username, string password, long formId, bool isPrinted, string message);
}
当我从Word 200调用方法RegisterPerformAcknowledge时,我得到以下编译异常: 标记为受限的函数或接口,或该函数使用不支持的自动化类型

下面是单词宏代码

    Set printer = New MyCOMObject.Registration
    printer.RegisterFormAcknowledge "test", "test", "test", "test", 12345, False, "CatalogWordTemplate Not Found"
有人知道为什么吗?VB6不支持长类型? RegisterForm的第一种方法运行良好

  [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
这是一个错误,VB6和VBA需要一个分派接口。样板文件是使用ComInterfaceType.InterfaceIsAutoDual,以便客户端代码可以使用早期和晚期绑定。您几乎肯定也需要修复实现此接口的类上的[ClassInterface]属性,因为您实际上可以进行调用,请使用ClassInterfaceType.None

只要参数类型不起作用,就使用VB6不支持的类型。VB1最初是16位工具,所以整数是16位,长是32位。没有用于64位积分的类型。如果打算使用VB6 Long,请使用int。如果不是,那么你需要考虑两倍,让你达到15位数或字符串。 这是一个错误,VB6和VBA需要一个分派接口。样板文件是使用ComInterfaceType.InterfaceIsAutoDual,以便客户端代码可以使用早期和晚期绑定。您几乎肯定也需要修复实现此接口的类上的[ClassInterface]属性,因为您实际上可以进行调用,请使用ClassInterfaceType.None

只要参数类型不起作用,就使用VB6不支持的类型。VB1最初是16位工具,所以整数是16位,长是32位。没有用于64位积分的类型。如果打算使用VB6 Long,请使用int。如果不是,那么你需要考虑两倍,让你达到15位数,或者字符串。

< P> C是一个符号<强> 64位< /强>整数,而不是。另一方面,C#是一个有符号的32位整数,它与自动化兼容

您询问了大整数,例如372036854775807

这个特别需要49位来表示。C#是一种标准,它可以表示最多需要53位的整数

还有C#,它映射到例如VBA的
十进制
(在
变量
中)。如果愿意,可以在参数定义之前使用
[MarshalAs(UnmanagedType.Currency)]
属性将其封送为VBA的
Currency
,一个有符号的64位整数

对于较大的值,最好使用
字符串。也就是说,如果你真的能在VBA中处理它们的话。

C#是一个有符号的64位整数,而不是。另一方面,C#是一个有符号的32位整数,它与自动化兼容

您询问了大整数,例如372036854775807

这个特别需要49位来表示。C#是一种标准,它可以表示最多需要53位的整数

还有C#,它映射到例如VBA的
十进制
(在
变量
中)。如果愿意,可以在参数定义之前使用
[MarshalAs(UnmanagedType.Currency)]
属性将其封送为VBA的
Currency
,一个有符号的64位整数


对于较大的值,最好使用
字符串。也就是说,如果你真的能在VBA中处理它们。

public void register(字符串服务器、字符串数据库、字符串用户名、字符串密码、long formId、bool isPrinted、string message)我只是将参数“long formId”改为“int formId”,它就可以工作了。有人知道为什么吗?是的,
long
是一个有符号的64位整数,它与自动化不兼容。另一方面,
int
是一个有符号的32位整数,它是自动兼容的。那么,如果我想传递一个大于int.Max的值,我应该通过字符串传递它,并在C代码中解析它?这取决于。如果没有签名,您可以使用
uint
,限制大约是
Int32.MaxValue
的两倍,即
UInt32.MaxValue
.public void RegisterFormAcknowledge(字符串服务器、字符串数据库、字符串用户名、字符串密码、long formId、bool isPrinted、字符串消息)我刚刚将参数“long formId”改为“int formId“这是有效的。有人知道为什么吗?是的,
long
是一个有符号的64位整数,它与自动化不兼容。另一方面,
int
是一个有符号的32位整数,它是自动兼容的。那么,如果我想传递一个大于int.Max的值,我应该通过字符串传递它,并在C代码中解析它?这取决于。如果没有签名,可以使用
uint
,限制大约是
Int32.MaxValue
的两倍,即
UInt32.MaxValue
+1来提取属性。我喜欢阅读,但64位版本的Office确实有一个
LongLong
类型,它是一个64位整数。+1用于提取属性。我喜欢阅读,不想把事情弄糟,但64位版本的Office确实有一个
LongLong
类型,它是一个64位整数。