C# Visual Basic.Net中的公共虚拟外部字符串等效项

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)

我正在翻译一个在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)]
  [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
上遇到了一个错误。可能我缺少了一些参数的参考?