公共虚拟外部字符串等效于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的声明。 另外,如果你可以帮助我澄清,如果“实施”声明是正确的,或者我应该写“继承”。提前谢谢了。

+0

'Implements'对于接口是正确的,'Inherits'对于类是正确的。 – Craig

+0

非常感谢!关于如何翻译“公共虚拟外部”部分的任何想法? –

+0

'public'直接映射。 '虚拟'我认为会'Overridable'。我不确定'extern',但是......这不是我在VB中需要做的事情。 – Craig

这是一个罕见的使用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类型是一个类或接口,我假设它是一个类,但你需要检查。

+0

嘿非常感谢您的帮助,除了包含“param:”部分的部分外,一切都很好,我尝试写下如下代码: param:= MarshalAs(UnmanagedType。 BStr) 但它告诉我“param”没有被定义,如果我只把它放在“param:”。 我需要导入一个库吗? –

+0

@LuisEnriquez:我已经更新了我的答案,使用“param: = ...“ –

+0

再次感谢,我已经把它写成''param:='”,但它仍然告诉我“Type'参数没有被定义。”我正在使用visual studio 2017,它告诉我使用“[ParamArray]”或“DefaultParameterValue”。如果我使用'DefaultParameterValue',它告诉我需要更改MarshalA,因为它可能由于其保护级别而无法访问。因此,如果我将其放置为'DefaultParameterValue(MarshalAsAttribute(UnmanagedType.BStr))','DefaultParameterValue'被标记为可行,但现在我在'MarshalAsAttribute'上出现错误。也许我错过了param的一些参考? –