未验证 提交 3b17fb8c 编写于 作者: E Elinor Fung 提交者: GitHub

Enable localization for LibraryImportGenerator (#67107)

上级 56979871
<Project>
<Import Project="..\Directory.Build.props" />
<PropertyGroup>
<IsShipping>false</IsShipping>
<!-- We manually enable LibraryImportGenerator for projects in this folder as part of testing. -->
<EnableLibraryImportGenerator>false</EnableLibraryImportGenerator>
<EnableDefaultItems>true</EnableDefaultItems>
<CLSCompliant>false</CLSCompliant>
<ILLinkTrimAssembly>false</ILLinkTrimAssembly>
<!-- Localization -->
<UsingToolXliff>true</UsingToolXliff>
<EnableDefaultEmbeddedResourceItems>false</EnableDefaultEmbeddedResourceItems>
</PropertyGroup>
</Project>
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using Microsoft.CodeAnalysis;
namespace Microsoft.Interop.Analyzers
......@@ -33,7 +34,7 @@ public static class Ids
internal static LocalizableResourceString GetResourceString(string resourceName)
{
return new LocalizableResourceString(resourceName, Resources.ResourceManager, typeof(Resources));
return new LocalizableResourceString(resourceName, SR.ResourceManager, typeof(FxResources.Microsoft.Interop.LibraryImportGenerator.SR));
}
}
}
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Runtime.InteropServices;
......@@ -27,12 +28,12 @@ public class ConvertToLibraryImportAnalyzer : DiagnosticAnalyzer
public static readonly DiagnosticDescriptor ConvertToLibraryImport =
new DiagnosticDescriptor(
Ids.ConvertToLibraryImport,
GetResourceString(nameof(Resources.ConvertToLibraryImportTitle)),
GetResourceString(nameof(Resources.ConvertToLibraryImportMessage)),
GetResourceString(nameof(SR.ConvertToLibraryImportTitle)),
GetResourceString(nameof(SR.ConvertToLibraryImportMessage)),
Category,
DiagnosticSeverity.Info,
isEnabledByDefault: false,
description: GetResourceString(nameof(Resources.ConvertToLibraryImportDescription)));
description: GetResourceString(nameof(SR.ConvertToLibraryImportDescription)));
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(ConvertToLibraryImport);
......
......@@ -59,7 +59,7 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
// Register code fix
context.RegisterCodeFix(
CodeAction.Create(
Resources.ConvertToLibraryImport,
SR.ConvertToLibraryImport,
cancelToken => ConvertToLibraryImport(
context.Document,
methodSyntax,
......@@ -81,7 +81,7 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
context.RegisterCodeFix(
CodeAction.Create(
string.Format(Resources.ConvertToLibraryImportWithSuffix, "A"),
string.Format(SR.ConvertToLibraryImportWithSuffix, "A"),
cancelToken => ConvertToLibraryImport(
context.Document,
methodSyntax,
......@@ -94,7 +94,7 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
context.RegisterCodeFix(
CodeAction.Create(
string.Format(Resources.ConvertToLibraryImportWithSuffix, "W"),
string.Format(SR.ConvertToLibraryImportWithSuffix, "W"),
cancelToken => ConvertToLibraryImport(
context.Document,
methodSyntax,
......@@ -135,7 +135,7 @@ private class CustomFixAllProvider : DocumentBasedFixAllProvider
bool shouldWarn = await TransformCallersOfNoPreserveSigMethod(editor, methodSymbol, fixAllContext.CancellationToken).ConfigureAwait(false);
if (shouldWarn)
{
generatedDeclaration = generatedDeclaration.WithAdditionalAnnotations(WarningAnnotation.Create(Resources.ConvertNoPreserveSigDllImportToGeneratedMayProduceInvalidCode));
generatedDeclaration = generatedDeclaration.WithAdditionalAnnotations(WarningAnnotation.Create(SR.ConvertNoPreserveSigDllImportToGeneratedMayProduceInvalidCode));
}
}
......@@ -176,7 +176,7 @@ private class CustomFixAllProvider : DocumentBasedFixAllProvider
bool shouldWarn = await TransformCallersOfNoPreserveSigMethod(editor, methodSymbol, cancellationToken).ConfigureAwait(false);
if (shouldWarn)
{
generatedDeclaration = generatedDeclaration.WithAdditionalAnnotations(WarningAnnotation.Create(Resources.ConvertNoPreserveSigDllImportToGeneratedMayProduceInvalidCode));
generatedDeclaration = generatedDeclaration.WithAdditionalAnnotations(WarningAnnotation.Create(SR.ConvertNoPreserveSigDllImportToGeneratedMayProduceInvalidCode));
}
}
......@@ -221,7 +221,7 @@ private class CustomFixAllProvider : DocumentBasedFixAllProvider
// Add annotation about potential behavioural and compatibility changes
libraryImportSyntax = libraryImportSyntax.WithAdditionalAnnotations(
WarningAnnotation.Create(string.Format(Resources.ConvertToLibraryImportWarning, "[TODO] Documentation link")));
WarningAnnotation.Create(string.Format(SR.ConvertToLibraryImportWarning, "[TODO] Documentation link")));
// Replace DllImport with LibraryImport
SyntaxNode generatedDeclaration = generator.ReplaceNode(methodSyntax, dllImportSyntax, libraryImportSyntax);
......
......@@ -115,7 +115,7 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
context.RegisterCodeFix(
CodeAction.Create(
Resources.AddMissingCustomTypeMarshallerMembers,
SR.AddMissingCustomTypeMarshallerMembers,
ct => AddMissingMembers(doc, node, missingMemberNames, ct),
AddMissingCustomTypeMarshallerMembersKey),
missingMembersDiagnostics);
......@@ -127,7 +127,7 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
{
context.RegisterCodeFix(
CodeAction.Create(
Resources.AddMissingFeaturesToCustomTypeMarshaller,
SR.AddMissingFeaturesToCustomTypeMarshaller,
ct => AddMissingFeatures(doc, node, featuresToAdd, ct),
AddMissingCustomTypeMarshallerFeaturesKey),
featuresToAddDiagnostics);
......
......@@ -30,142 +30,142 @@ public class Ids
public static readonly DiagnosticDescriptor InvalidAttributedMethodSignature =
new DiagnosticDescriptor(
Ids.InvalidLibraryImportAttributeUsage,
GetResourceString(nameof(Resources.InvalidLibraryImportAttributeUsageTitle)),
GetResourceString(nameof(Resources.InvalidAttributedMethodSignatureMessage)),
GetResourceString(nameof(SR.InvalidLibraryImportAttributeUsageTitle)),
GetResourceString(nameof(SR.InvalidAttributedMethodSignatureMessage)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.InvalidAttributedMethodDescription)));
description: GetResourceString(nameof(SR.InvalidAttributedMethodDescription)));
public static readonly DiagnosticDescriptor InvalidAttributedMethodContainingTypeMissingModifiers =
new DiagnosticDescriptor(
Ids.InvalidLibraryImportAttributeUsage,
GetResourceString(nameof(Resources.InvalidLibraryImportAttributeUsageTitle)),
GetResourceString(nameof(Resources.InvalidAttributedMethodContainingTypeMissingModifiersMessage)),
GetResourceString(nameof(SR.InvalidLibraryImportAttributeUsageTitle)),
GetResourceString(nameof(SR.InvalidAttributedMethodContainingTypeMissingModifiersMessage)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.InvalidAttributedMethodDescription)));
description: GetResourceString(nameof(SR.InvalidAttributedMethodDescription)));
public static readonly DiagnosticDescriptor InvalidStringMarshallingConfiguration =
new DiagnosticDescriptor(
Ids.InvalidLibraryImportAttributeUsage,
GetResourceString(nameof(Resources.InvalidLibraryImportAttributeUsageTitle)),
GetResourceString(nameof(Resources.InvalidStringMarshallingConfigurationMessage)),
GetResourceString(nameof(SR.InvalidLibraryImportAttributeUsageTitle)),
GetResourceString(nameof(SR.InvalidStringMarshallingConfigurationMessage)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.InvalidStringMarshallingConfigurationDescription)));
description: GetResourceString(nameof(SR.InvalidStringMarshallingConfigurationDescription)));
public static readonly DiagnosticDescriptor ParameterTypeNotSupported =
new DiagnosticDescriptor(
Ids.TypeNotSupported,
GetResourceString(nameof(Resources.TypeNotSupportedTitle)),
GetResourceString(nameof(Resources.TypeNotSupportedMessageParameter)),
GetResourceString(nameof(SR.TypeNotSupportedTitle)),
GetResourceString(nameof(SR.TypeNotSupportedMessageParameter)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.TypeNotSupportedDescription)));
description: GetResourceString(nameof(SR.TypeNotSupportedDescription)));
public static readonly DiagnosticDescriptor ReturnTypeNotSupported =
new DiagnosticDescriptor(
Ids.TypeNotSupported,
GetResourceString(nameof(Resources.TypeNotSupportedTitle)),
GetResourceString(nameof(Resources.TypeNotSupportedMessageReturn)),
GetResourceString(nameof(SR.TypeNotSupportedTitle)),
GetResourceString(nameof(SR.TypeNotSupportedMessageReturn)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.TypeNotSupportedDescription)));
description: GetResourceString(nameof(SR.TypeNotSupportedDescription)));
public static readonly DiagnosticDescriptor ParameterTypeNotSupportedWithDetails =
new DiagnosticDescriptor(
Ids.TypeNotSupported,
GetResourceString(nameof(Resources.TypeNotSupportedTitle)),
GetResourceString(nameof(Resources.TypeNotSupportedMessageParameterWithDetails)),
GetResourceString(nameof(SR.TypeNotSupportedTitle)),
GetResourceString(nameof(SR.TypeNotSupportedMessageParameterWithDetails)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.TypeNotSupportedDescription)));
description: GetResourceString(nameof(SR.TypeNotSupportedDescription)));
public static readonly DiagnosticDescriptor ReturnTypeNotSupportedWithDetails =
new DiagnosticDescriptor(
Ids.TypeNotSupported,
GetResourceString(nameof(Resources.TypeNotSupportedTitle)),
GetResourceString(nameof(Resources.TypeNotSupportedMessageReturnWithDetails)),
GetResourceString(nameof(SR.TypeNotSupportedTitle)),
GetResourceString(nameof(SR.TypeNotSupportedMessageReturnWithDetails)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.TypeNotSupportedDescription)));
description: GetResourceString(nameof(SR.TypeNotSupportedDescription)));
public static readonly DiagnosticDescriptor ParameterConfigurationNotSupported =
new DiagnosticDescriptor(
Ids.ConfigurationNotSupported,
GetResourceString(nameof(Resources.ConfigurationNotSupportedTitle)),
GetResourceString(nameof(Resources.ConfigurationNotSupportedMessageParameter)),
GetResourceString(nameof(SR.ConfigurationNotSupportedTitle)),
GetResourceString(nameof(SR.ConfigurationNotSupportedMessageParameter)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.ConfigurationNotSupportedDescription)));
description: GetResourceString(nameof(SR.ConfigurationNotSupportedDescription)));
public static readonly DiagnosticDescriptor ReturnConfigurationNotSupported =
new DiagnosticDescriptor(
Ids.ConfigurationNotSupported,
GetResourceString(nameof(Resources.ConfigurationNotSupportedTitle)),
GetResourceString(nameof(Resources.ConfigurationNotSupportedMessageReturn)),
GetResourceString(nameof(SR.ConfigurationNotSupportedTitle)),
GetResourceString(nameof(SR.ConfigurationNotSupportedMessageReturn)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.ConfigurationNotSupportedDescription)));
description: GetResourceString(nameof(SR.ConfigurationNotSupportedDescription)));
public static readonly DiagnosticDescriptor ConfigurationNotSupported =
new DiagnosticDescriptor(
Ids.ConfigurationNotSupported,
GetResourceString(nameof(Resources.ConfigurationNotSupportedTitle)),
GetResourceString(nameof(Resources.ConfigurationNotSupportedMessage)),
GetResourceString(nameof(SR.ConfigurationNotSupportedTitle)),
GetResourceString(nameof(SR.ConfigurationNotSupportedMessage)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.ConfigurationNotSupportedDescription)));
description: GetResourceString(nameof(SR.ConfigurationNotSupportedDescription)));
public static readonly DiagnosticDescriptor ConfigurationValueNotSupported =
new DiagnosticDescriptor(
Ids.ConfigurationNotSupported,
GetResourceString(nameof(Resources.ConfigurationNotSupportedTitle)),
GetResourceString(nameof(Resources.ConfigurationNotSupportedMessageValue)),
GetResourceString(nameof(SR.ConfigurationNotSupportedTitle)),
GetResourceString(nameof(SR.ConfigurationNotSupportedMessageValue)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.ConfigurationNotSupportedDescription)));
description: GetResourceString(nameof(SR.ConfigurationNotSupportedDescription)));
public static readonly DiagnosticDescriptor MarshallingAttributeConfigurationNotSupported =
new DiagnosticDescriptor(
Ids.ConfigurationNotSupported,
GetResourceString(nameof(Resources.ConfigurationNotSupportedTitle)),
GetResourceString(nameof(Resources.ConfigurationNotSupportedMessageMarshallingInfo)),
GetResourceString(nameof(SR.ConfigurationNotSupportedTitle)),
GetResourceString(nameof(SR.ConfigurationNotSupportedMessageMarshallingInfo)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.ConfigurationNotSupportedDescription)));
description: GetResourceString(nameof(SR.ConfigurationNotSupportedDescription)));
public static readonly DiagnosticDescriptor TargetFrameworkNotSupported =
new DiagnosticDescriptor(
Ids.TargetFrameworkNotSupported,
GetResourceString(nameof(Resources.TargetFrameworkNotSupportedTitle)),
GetResourceString(nameof(Resources.TargetFrameworkNotSupportedMessage)),
GetResourceString(nameof(SR.TargetFrameworkNotSupportedTitle)),
GetResourceString(nameof(SR.TargetFrameworkNotSupportedMessage)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.TargetFrameworkNotSupportedDescription)));
description: GetResourceString(nameof(SR.TargetFrameworkNotSupportedDescription)));
public static readonly DiagnosticDescriptor CannotForwardToDllImport =
new DiagnosticDescriptor(
Ids.CannotForwardToDllImport,
GetResourceString(nameof(Resources.CannotForwardToDllImportTitle)),
GetResourceString(nameof(Resources.CannotForwardToDllImportMessage)),
GetResourceString(nameof(SR.CannotForwardToDllImportTitle)),
GetResourceString(nameof(SR.CannotForwardToDllImportMessage)),
Category,
DiagnosticSeverity.Error,
isEnabledByDefault: true,
description: GetResourceString(nameof(Resources.CannotForwardToDllImportDescription)));
description: GetResourceString(nameof(SR.CannotForwardToDllImportDescription)));
private readonly List<Diagnostic> _diagnostics = new List<Diagnostic>();
......@@ -316,7 +316,7 @@ public class Ids
_diagnostics.Add(
attributeData.CreateDiagnostic(
GeneratorDiagnostics.MarshallingAttributeConfigurationNotSupported,
new LocalizableResourceString(reasonResourceName, Resources.ResourceManager, typeof(Resources), reasonArgs)));
new LocalizableResourceString(reasonResourceName, SR.ResourceManager, typeof(FxResources.Microsoft.Interop.LibraryImportGenerator.SR), reasonArgs)));
}
/// <summary>
......@@ -349,7 +349,7 @@ public void ReportCannotForwardToDllImport(MethodDeclarationSyntax method, strin
private static LocalizableResourceString GetResourceString(string resourceName)
{
return new LocalizableResourceString(resourceName, Resources.ResourceManager, typeof(Resources));
return new LocalizableResourceString(resourceName, SR.ResourceManager, typeof(FxResources.Microsoft.Interop.LibraryImportGenerator.SR));
}
}
}
......@@ -459,14 +459,14 @@ private static IncrementalStubGenerationContext CalculateStubInformation(IMethod
if (libraryImportData.StringMarshalling == StringMarshalling.Custom && libraryImportData.StringMarshallingCustomType is null)
{
generatorDiagnostics.ReportInvalidStringMarshallingConfiguration(
generatedDllImportAttr, symbol.Name, Resources.InvalidStringMarshallingConfigurationMissingCustomType);
generatedDllImportAttr, symbol.Name, SR.InvalidStringMarshallingConfigurationMissingCustomType);
}
// User specified something other than StringMarshalling.Custom while specifying StringMarshallingCustomType
if (libraryImportData.StringMarshalling != StringMarshalling.Custom && libraryImportData.StringMarshallingCustomType is not null)
{
generatorDiagnostics.ReportInvalidStringMarshallingConfiguration(
generatedDllImportAttr, symbol.Name, Resources.InvalidStringMarshallingConfigurationNotCustom);
generatedDllImportAttr, symbol.Name, SR.InvalidStringMarshallingConfigurationNotCustom);
}
}
......
......@@ -21,8 +21,6 @@
<PackageProjectUrl>https://github.com/dotnet/runtime/tree/main/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator</PackageProjectUrl>
<Description>LibraryImportGenerator</Description>
<PackageTags>LibraryImportGenerator, analyzers</PackageTags>
<!-- TODO: Enable when this package shipped. -->
<DisablePackageBaselineValidation>true</DisablePackageBaselineValidation>
</PropertyGroup>
<ItemGroup>
......@@ -30,19 +28,6 @@
<Compile Include="$(CoreLibSharedDir)System\Runtime\InteropServices\StringMarshalling.cs" Link="Production\StringMarshalling.cs" />
</ItemGroup>
<ItemGroup>
<Compile Update="Resources.Designer.cs"
DesignTime="True"
AutoGen="True"
DependentUpon="Resources.resx" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Resources.resx"
Generator="ResXFileCodeGenerator"
LastGenOutput="Resources.Designer.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="$(MicrosoftCodeAnalysisVersion)" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="$(MicrosoftCodeAnalysisAnalyzersVersion)" PrivateAssets="all" />
......
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Microsoft.CodeAnalysis;
......@@ -54,7 +55,7 @@ public IMarshallingGenerator Create(TypePositionInfo info, StubCodeContext conte
UnmanagedBlittableMarshallingInfo or NativeMarshallingAttributeInfo when !Options.RuntimeMarshallingDisabled =>
throw new MarshallingNotSupportedException(info, context)
{
NotSupportedDetails = Resources.RuntimeMarshallingMustBeDisabled
NotSupportedDetails = SR.RuntimeMarshallingMustBeDisabled
},
GeneratedNativeMarshallingAttributeInfo => s_forwarder,
MissingSupportMarshallingInfo => s_forwarder,
......@@ -73,7 +74,7 @@ private static ExpressionSyntax GetNumElementsExpressionFromMarshallingInfo(Type
CountElementCountInfo(TypePositionInfo elementInfo) => CheckedExpression(SyntaxKind.CheckedExpression, GetExpressionForParam(elementInfo)),
_ => throw new MarshallingNotSupportedException(info, context)
{
NotSupportedDetails = Resources.ArraySizeMustBeSpecified
NotSupportedDetails = SR.ArraySizeMustBeSpecified
},
};
......@@ -103,7 +104,7 @@ ExpressionSyntax GetExpressionForParam(TypePositionInfo paramInfo)
{
throw new MarshallingNotSupportedException(info, context)
{
NotSupportedDetails = Resources.CollectionSizeParamTypeMustBeIntegral
NotSupportedDetails = SR.CollectionSizeParamTypeMustBeIntegral
};
}
}
......@@ -112,7 +113,7 @@ ExpressionSyntax GetExpressionForParam(TypePositionInfo paramInfo)
{
throw new MarshallingNotSupportedException(info, context)
{
NotSupportedDetails = Resources.CollectionSizeParamTypeMustBeIntegral
NotSupportedDetails = SR.CollectionSizeParamTypeMustBeIntegral
};
}
......@@ -202,7 +203,7 @@ private void ValidateCustomNativeTypeMarshallingSupported(TypePositionInfo info,
{
throw new MarshallingNotSupportedException(info, context)
{
NotSupportedDetails = string.Format(Resources.CustomTypeMarshallingNativeToManagedUnsupported, marshalInfo.NativeMarshallingType.FullTypeName)
NotSupportedDetails = string.Format(SR.CustomTypeMarshallingNativeToManagedUnsupported, marshalInfo.NativeMarshallingType.FullTypeName)
};
}
// The marshalling method for this type doesn't support marshalling from managed to native by value,
......@@ -215,7 +216,7 @@ private void ValidateCustomNativeTypeMarshallingSupported(TypePositionInfo info,
{
throw new MarshallingNotSupportedException(info, context)
{
NotSupportedDetails = string.Format(Resources.CustomTypeMarshallingManagedToNativeUnsupported, marshalInfo.NativeMarshallingType.FullTypeName)
NotSupportedDetails = string.Format(SR.CustomTypeMarshallingManagedToNativeUnsupported, marshalInfo.NativeMarshallingType.FullTypeName)
};
}
// The marshalling method for this type doesn't support marshalling from managed to native by reference,
......@@ -227,7 +228,7 @@ private void ValidateCustomNativeTypeMarshallingSupported(TypePositionInfo info,
{
throw new MarshallingNotSupportedException(info, context)
{
NotSupportedDetails = string.Format(Resources.CustomTypeMarshallingManagedToNativeUnsupported, marshalInfo.NativeMarshallingType.FullTypeName)
NotSupportedDetails = string.Format(SR.CustomTypeMarshallingManagedToNativeUnsupported, marshalInfo.NativeMarshallingType.FullTypeName)
};
}
// The marshalling method for this type doesn't support marshalling from managed to native by reference,
......@@ -239,7 +240,7 @@ private void ValidateCustomNativeTypeMarshallingSupported(TypePositionInfo info,
{
throw new MarshallingNotSupportedException(info, context)
{
NotSupportedDetails = string.Format(Resources.CustomTypeMarshallingManagedToNativeUnsupported, marshalInfo.NativeMarshallingType.FullTypeName)
NotSupportedDetails = string.Format(SR.CustomTypeMarshallingManagedToNativeUnsupported, marshalInfo.NativeMarshallingType.FullTypeName)
};
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册