C# Visual Basic.Net中的公共虚拟外部字符串等效项
我正在翻译一个在C#上编写的dll,在翻译字符串声明时遇到了一些麻烦。C#中的代码如下:C# Visual Basic.Net中的公共虚拟外部字符串等效项,c#,vb.net,dll,overriding,C#,Vb.net,Dll,Overriding,我正在翻译一个在C#上编写的dll,在翻译字符串声明时遇到了一些麻烦。C#中的代码如下: using BGMC_TypeDefs; using stdole; using System.Runtime.CopilerServices; using System.Runtime.InteropServices; namespace bgmcproject { [Guid("3C69B26B-8D17-11D3-BA9C-00E09803AA6A")] [ClassInterface(0)
using BGMC_TypeDefs;
using stdole;
using System.Runtime.CopilerServices;
using System.Runtime.InteropServices;
namespace bgmcproject
{
[Guid("3C69B26B-8D17-11D3-BA9C-00E09803AA6A")]
[ClassInterface(0)]
[ComSourceInterfaces("bgmcproject.__bgmc\0\0")]
[TypeLibType(32)]
[ComImport]
public class bgmcClass : _bgmc, bgmc, __bgmc_Event
{
[DispId(1745027134)]
public virtual extern string szMachineImg { [DispId(1745027134), MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] [param: MarshalAs(UnmanagedType.BStr), In] set; }
}
}
我已经翻译了一些代码,结果是:
Imports BGMC_TypeDefs
Imports stdole
Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices
Namespace bgmcproject
<Guid("3C69B26B-8D17-11D3-BA9C-00E09803AA6A")>
<ClassInterface(0)>
<ComSourceInterfaces("bgmcproject.__bgmc\0\0")>
<TypeLibType(32)>
<ComImport>
Public Class bgmcClass
Implements _bgmc, bgmc, __bgmc_Event
<DispId(1745027134)>
Public virtual external String szMachineImg _
(<DispId(1745027134), MethodImpl(MethodImplOptions.InternalCall, _
MethodCodeType = MethodCodeType.Runtime)> _
<param MarshalAs(UnmanagedType.BStr), In> Set )
End Class
End Namespace
导入BGMC\u TypeDefs
进口利多卡因
导入System.Runtime.CompilerServices
导入System.Runtime.InteropServices
名称空间bgmcproject
公共类
实现bgmc、bgmc、bgmc事件
公共虚拟外部字符串szMachineImg\u
( _
(套)
末级
结束命名空间
我想知道深圳市政府的声明是怎么写的。
另外,如果你能帮我澄清一下,“Implements”语句是否正确,或者我应该写“Inherits”。非常感谢。很少使用extern关键字,但没有附带DllImport属性。extern关键字与MethodImpl属性以及MethodImplOptions.InternalCall枚举值组合表示代码在CLR本身中实现: (见丹·阿布拉莫夫的回答) 在VB中,我认为不能单独指定“set”或“get”上的属性,除非属性是以“long form”编写的,因此与代码等效的VB应该是:
Imports Microsoft.VisualBasic
Imports System.Runtime.CopilerServices
Imports System.Runtime.InteropServices
Namespace bgmcproject
<Guid("3C69B26B-8D17-11D3-BA9C-00E09803AA6A"), ClassInterface(0), ComSourceInterfaces("bgmcproject.__bgmc" & vbNullChar & vbNullChar), TypeLibType(32), ComImport>
Public Class bgmcClass
Inherits _bgmc
Implements bgmc, __bgmc_Event
<DispId(1745027134)>
Public Overridable WriteOnly Property szMachineImg() As String
<DispId(1745027134), MethodImpl(MethodImplOptions.InternalCall, MethodCodeType := MethodCodeType.Runtime), param:= MarshalAs(UnmanagedType.BStr), [In]>
Set(ByVal value As String)
End Set
End Property
End Class
End Namespace
导入Microsoft.VisualBasic
导入System.Runtime.CopilerServices
导入System.Runtime.InteropServices
名称空间bgmcproject
公共类
继承
实现bgmc,bgmc事件
作为字符串的公共可重写WriteOnly属性szMachineImg()
设置(ByVal值作为字符串)
端集
端属性
末级
结束命名空间
另外,关于第一个bgmc类型是类还是接口,我假设它是类,但您需要检查。
实现
对于接口是正确的,继承
对于类是正确的。非常感谢!知道我如何翻译“公共虚拟外部”部分吗?Public
直接映射<代码>虚拟的我认为是可以覆盖的。我不确定是否有外部
,不过。。。这不是我在VB中需要做的事情。再次感谢!你认为我可以把它写成函数吗?像这样:。公共可重写函数szMachineImg(Set)作为字符串结束函数不幸的是,您已经超出了我的专业知识范围。对不起(嘿,非常感谢您的帮助,除了“param:”部分之外,一切都很好。我试着像这样编写:param:=marshallas(UnmanagedType.BStr),但它告诉我“param”没有定义,如果我只输入like“param:”。我需要导入库吗?@LuisEnriquez:我已经更新了我的答案,使用“param:=…”。再次感谢,我已经将其设置为“param:=
”,但它仍然告诉我“类型”param未定义。我正在使用visual studio 2017,在它告诉我要使用的潜在修复中,“[ParamArray]
”或“DefaultParameterValue
”。如果我使用DefaultParameterValue
,它会告诉我需要更改MarshalAs,因为它可能由于其保护级别而无法访问。因此,如果我将其类似于DefaultParameterValue(MarshalAsAttribute(UnmanagedType.BStr))
,DefaultParameterValue
被标记为可以使用,但是现在我在MarshalAsAttribute
上遇到了一个错误。可能我缺少了一些参数的参考?