سؤال

لدي مكتبة صفية تحتوي على بعض طرق الامتداد المكتوبة بلغة C# وموقع ويب قديم مكتوب بلغة VB.

أرغب في استدعاء طرق الامتداد الخاصة بي من كود VB ولكنها لا تظهر في التحسس الذكي وأحصل على أخطاء في الترجمة عندما أقوم بزيارة الموقع.

لقد حصلت على كل المطلوب يستوردs لأن الفئات الأخرى الموجودة في نفس مساحات الأسماء تظهر بشكل جيد في Intelisense.

أي اقتراحات

يحرر: مزيد من المعلومات للمساعدة في بعض التعليقات.

التنفيذ الخاص بي يبدو هكذا

//C# code compiled as DLL
namespace x.y {
    public static class z {
        public static string q (this string s){
             return s + " " + s;
        }

    }
}

واستخدامي مثل هذا

Imports x.y

'...'
Dim r as string = "greg"
Dim s as string = r.q() ' does not show in intelisense
                        ' and throws error : Compiler Error Message: BC30203: Identifier expected.
هل كانت مفيدة؟

المحلول

وكان يعمل بالنسبة لي، على الرغم من أن هناك عددا من المراوغات. أولا، أنا خلق مكتبة # الطبقة C استهداف .NET Framework 3.5. هنا هو رمز الوحيد في المشروع:

using System;

namespace ExtensionLibrary
{
  public static class Extensions
  {
    public static string CustomExtension(this string text)
    {
      char[] chars = text.ToCharArray();
      Array.Reverse(chars);
      return new string(chars);
    }
  }
}

وبعد ذلك أنا خلقت التطبيق وحدة التحكم VB تستهدف الصافي 3.5، وأضاف في اشارة الى بلدي C # المشروع. أنا سميت Module1.vb إلى Test.vb، وهنا رمز:

Imports ExtensionLibrary

Module Test

    Sub Main()
        Console.WriteLine("Hello".CustomExtension())
    End Sub

End Module

وهذا يجمع وأشواط. (كنت قد استدعاء الأسلوب العكسي ()، ولكن لم أكن متأكدا ما إذا كان VB قد سحرية وقد عكس قدرات بالفعل في مكان ما - أنا لست خبير VB من الطباشير طويلة)

في البداية، لم أكن عرضت ExtensionLibrary أنه مستورد من التحسس. حتى بعد بناء، و"الواردات ExtensionLibrary" والرمادي خارج، ويقدم المصباح الفرصة لإزالة استيراد يفترض زائدة عن الحاجة. (وبذلك يكسر المشروع.) فمن الممكن أن هذه ReSharper بدلا من البصرية ستوديو، فتذكروا.

وذلك لخفض قصة قصيرة طويلة، ويمكن القيام به، وينبغي أن تعمل على ما يرام. أنا لا أفترض أن المشكلة هي أنك إما تستخدم نسخة قديمة من VB أو لا يستهدف المشروع الخاص بك. NET 3.5؟

وكما ذكر في تصريحات: هناك هوس إضافي واحد، وهو أن أساليب الإرشاد لن يمكن العثور عليها عندما يكون نوع وقت الترجمة من الهدف وObject .

نصائح أخرى

وأساليب الإرشاد والسكر فقط النحوي لأساليب ثابتة. لذلك

public static string MyExtMethod(this string s)

ويمكن أن يطلق في كل من VB.NET و C # مع

MyExtMethod("myArgument")

وOK. واستنادا إلى رسالة الخطأ التي هي بالتأكيد <م> لا باستخدام أحدث نسخة VB (VB 9!) أو الخطأ لا علاقة لهذه المشكلة على الإطلاق لأنه عندها ستحصل عليه خطأ آخر إذا كان الأسلوب لم يتم العثور على:

<اقتباس فقرة>   

والخطأ 1 'ف' ليس عضوا في 'سلسلة'.

Imports x.y

'...'
Dim r As String = "greg"
Dim s As String = r.q() 'same as z.q(r) 

واعتقد انني اجه مشكلة مماثلة : VB.Net سعيدة جدا لتجميع على من خلال طرق الإرشاد وتركهم ليتم الاستدلال في وقت التشغيل إذا Option Strict هو خارج.

ولكن، VB.Net حقا لا يبدو أن مثل طرق الإرشاد على أنواع أساسية. لا يمكنك توسيع Object وأنه لا يمكن حلها إذا كنت تفعل:

وC #

namespace NS
...

public static class Utility {

    public static void Something(this object input) { ...

    public static void Something(this string input) { ...

}

// Works fine, resolves to 2nd method
"test".Something();

// At compile time C# converts the above to:
Utility.Something("test");

ولكن هذا يذهب على نحو خاطئ في VB.Net:

Option Infer On
Option Explicit On
Option Strict Off
Imports NS
...

    Dim r as String = "test" 
    r.Something()

وهذا يجمع دون خطأ، ولكن على المدى فشل وقت لSomething ليس وسيلة لString - المترجم فشلت في استبدال نحوي السكر من طريقة تمديد مع الدعوة ثابتة لUtility.Something

.

والسؤال هو لماذا؟ حسنا خلافا C #، <م> VB.Net لا يمكن التعامل مع أي تمديد لObject ! طريقة تمديد صالح في C # يخلط المترجم VB.Net.

وكقاعدة عامة VB.Net، فما استقاموا لكم فاستقيموا تجنب استخدام طرق الإرشاد مع أي من أنواع. صافي الأساسية (Object، String، Integer، الخ). لديك أيضا أن نكون حذرين مع Option Infer كما في حين انها على افتراضيا في Visual Studio انها إيقاف افتراضيا ليجمع سطر الأوامر، VBCodeProvider، وربما في المواقع على شبكة الإنترنت (اعتمادا على الملف web.config الخاص بك). عندما يكون حالا يعتبر كل شيء في VB.Net أن يكون Object وجميع طرق الإرشاد سيترك حتى وقت التشغيل (وبالتالي سوف تفشل).

وأعتقد أن مايكروسوفت انخفض حقا الكرة عندما أضافوا طرق الإرشاد إلى VB.Net، وأعتقد أنه كان مرحلة لاحقة لمحاولة (وفشل) لجعلها متسقة مع C #.

وأنا لا أعرف ما اذا كان يمكنك الاتصال بهم في نفس نقطة تدوين كما تفعل في C #، ولكن أعتقد أن الأساليب تمديد ثابتة سوف تظهر وظائف ثابتة كما هو الحال مع حجة قبضة كنوع الموسعة. لذلك يجب عليك أن تكون قادرا على استدعاء الطبقة الواقع في VB مع:

StaticClass.ExtensionMethod(theString, arg1, ..., argN)

وأين في C # كنت قد كتبت للتو:

theString.ExtensionMethod(arg1, ..., argN);

ومع StaticClass هو اسم من فئة ثابتة التي قمت بتعريفها طرق الإرشاد الخاص بك.

<اقتباس فقرة>   

... والموقع القديم مكتوب في VB.

هل "القديمة" هنا وتنطوي ربما أنك أيضا استخدام نسخة قديمة من VB هنا؟ على أي حال، منذ طرق الإرشاد هي ساكنة فقط الفانيليا ( "Shared") طرق مزينة سمة، أنت <م> يجب أن تكون قادرا على الاتصال بهم في أي حال.

إذا لم يكن ذلك ممكنا لك إما محاولة الاتصال بهم "على غرار التمديد" في نسخة قديمة من VB أو كنت الرجوع إلى إصدار خاطئ من الخاص بك C # التجمع.

وتحرير: هل أنت متأكد أنك Importing و<م> كله مساحة، أي x.y وليس x فقط؟ VB غير قادرة على الوصول إلى مساحات متداخلة أسهل من C # حتى تتمكن من استخدام فئات من x.y مساحة باستخدام التعليمات البرمجية التالية في VB. ومع ذلك، لطرق الإرشاد في العمل، و<م> كامل لابد من Imported المسار.

Imports x
Dim x As New y.SomeClass()

شيئين للتحقق:

  1. أنت تستهدف .Net 3.5
  2. أنت تشير إلى ملف DLL

قد تقترح بعض الأدوات بشكل غير صحيح طرق تمديد للمشاريع التي لا تدعمها.

وأنا واجهت نفس المشكلة، وربما عن طريق الخطأ قد عثر عليها الحل. إذا كنت

x.y.r.q()

و، فإنه رمى نفس الخطأ بالنسبة لي كذلك. ولكن إذا كنت المستوردة x.y، لأنها عملت، لذلك:

using x.y;
...
r.q()

وعلى ما يرام.

وهكذا على ما يبدو لديك لاستيراده في الإعلان والعمل على انجاحه.

وكان هذا منذ فترة طويلة، وأنا لا أستطيع حقا كيف حلها، ولكن غني عن القول، كان خطأ المستخدم. أنا ربما إعادة تشغيل جهاز الكمبيوتر الخاص بي، وبعيدا ذهب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top