公共虚拟外部字符串等效于Visual Basic .Net
我正在翻译一个写在C#上的dll,并且我有一些麻烦来转换字符串声明。在C#中的代码如下:公共虚拟外部字符串等效于Visual Basic .Net
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
我想知道怎么写szMachingeImg的声明。 另外,如果你可以帮助我澄清,如果“实施”声明是正确的,或者我应该写“继承”。提前谢谢了。
这是一个罕见的使用extern关键字而没有附带的DllImport属性。使用MethodImplOptions.InternalCall枚举值将extern关键字与MethodImpl属性相结合表示该代码在CLR本身中实现: How does extern work in C#?(请参阅Dan Abramov的回答)。在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
此外,关于是否第一个_bgmc类型是一个类或接口,我假设它是一个类,但你需要检查。
嘿非常感谢您的帮助,除了包含“param:”部分的部分外,一切都很好,我尝试写下如下代码: param:= MarshalAs(UnmanagedType。 BStr) 但它告诉我“param”没有被定义,如果我只把它放在“param:”。 我需要导入一个库吗? –
@LuisEnriquez:我已经更新了我的答案,使用“param: = ...“ –
再次感谢,我已经把它写成''param:='”,但它仍然告诉我“Type'参数没有被定义。”我正在使用visual studio 2017,它告诉我使用“[ParamArray]”或“DefaultParameterValue”。如果我使用'DefaultParameterValue',它告诉我需要更改MarshalA,因为它可能由于其保护级别而无法访问。因此,如果我将其放置为'DefaultParameterValue(MarshalAsAttribute(UnmanagedType.BStr))','DefaultParameterValue'被标记为可行,但现在我在'MarshalAsAttribute'上出现错误。也许我错过了param的一些参考? –
'Implements'对于接口是正确的,'Inherits'对于类是正确的。 – Craig
非常感谢!关于如何翻译“公共虚拟外部”部分的任何想法? –
'public'直接映射。 '虚拟'我认为会'Overridable'。我不确定'extern',但是......这不是我在VB中需要做的事情。 – Craig