الكثير من تحذيرات البناء عند الإشارة إلى كائنات COM ActiveDs أو MSXML2
-
06-07-2019 - |
سؤال
بعد نقل مشروع من .NET 1.1 إلى .NET 2.0، يُصدر MsBuild الكثير من التحذيرات لبعض كائنات COM.
رمز نموذجي للاختبار (لا يهم الكود الفعلي، يُستخدم فقط لإنشاء التحذيرات):
using System;
using System.DirectoryServices;
using ActiveDs;
namespace Test
{
public class Class1
{
public static void Main(string[] args)
{
string adsPath = String.Format("WinNT://{0}/{1}", args[0], args[1]);
DirectoryEntry localuser = new DirectoryEntry(adsPath);
IADsUser pUser = (IADsUser) localuser.NativeObject;
Console.WriteLine("User = {0}", pUser.ADsPath);
}
}
}
تبدو رسائل التحذير
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets:تحذير :لا يمكن تنظيم واحدة على الأقل من وسيطات 'ITypeLib.RemoteGetLibAttr' بواسطة منظم وقت التشغيل.وبالتالي، سيتم تمرير مثل هذه الوسائط كمؤشر وقد تتطلب تعليمات برمجية غير آمنة للتعامل معها.
الملاحظات:
- يحدث لـ ActiveDs (11 تحذيرًا) وMSXML2 (54 تحذيرًا).
- لم يتم رؤيته لكائنات COM الخاصة بنا.
<Reference>
الإدخال في ملف .csproj يحتوي على السمةWrapperTool = "tlbimp"
- على الرغم من كل التحذيرات، لم يتم ملاحظة أي مشاكل في نظام التشغيل.
هل لديك أي فكرة عن كيفية التخلص من التحذيرات؟
المحلول
بحسب تعليق في مقالة MDSN حول TLBIMP للإصدار 2.0, ، لا يمكنك حل هذه المشكلة بدون تشغيل TLBIMP بنفسك.
كان من السهل إعادة إنتاج مشكلتك باستخدام VS.لقد قمت أيضًا بإعادة إنتاجه باستخدام TLBIMP يدويًا من موجه تعليق VS:
tlbimp c:\WINNT\system32\activeds.tlb /out:interop.activeds.dll
كان الإصلاح هو استخدام رمز التبديل /صامت
tlbimp c:\WINNT\system32\activeds.tlb /silent /out:interop.activeds.dll
كما هو موضح في التعليق في مقالة MSDN، يصبح مرجع COM مرجع تجميع .net لتجميع إمكانية التشغيل المتداخل الذي قمت بإنشائه بنفسك.
أنا لست خبيرًا في VS، لكنني أنجزت هذا العمل عن طريق إضافة إنشاء مسبق إلى المشروع:
"$(DevEnvDir)\..\..\SDK\v2.0\bin\tlbimp" c:\WINNT\system32\activeds.tlb
/namespace:ActiveDs /silent /out:"$(ProjectDir)interop.activeds.dll"
لقد قمت بإنشائه مرة واحدة حتى يكون لدي ملف dll لإضافة مرجع مع علامة تبويب التصفح.تمت إضافة مرجع إلى interop.activeds.dll في جذر مشروعي ثم تم إنشاؤه مرة أخرى.قد ترغب في القيام بذلك بطريقة أخرى، مثل إنشاء ملف خارجي عبر مشروع C++.هذا هو أكثر من POC.
لاحظ اختلافًا مضحكًا بين MSBUILD وVS، $(DevEnvDir) يحتوي على شرطة مائلة عكسية زائدة ولكن MSBUILD لا يحتوي عليه.
نصائح أخرى
لقد واجهت نفس المشكلة وقمت بإصلاحها عن طريق تحرير ملف المشروع (.csproj)، باتباع الاقتراح من هنا:
أضفت المفتاح التالي إلى مجموعة الخصائص لكل تكوين بناء:
<ResolveComReferenceSilent>True</ResolveComReferenceSilent>
يمكنك إيقاف التحذيرات من خلال:
#pragma warning disable warning-list #pragma warning restore warning-list
حيث قائمة التحذير هي قائمة مفصولة بفواصل من أرقام التحذير.
يعني التحذير أن typelib الذي تستورده يحتوي على شيء غير قابل للترجمة إلى تعليمات برمجية مُدارة ولكن يمكن التعامل معه باستخدام عمليات المؤشر، في كتلة تعليمات برمجية غير آمنة.كانت التعليمات البرمجية غير قابلة للترجمة في .Net 1.1 أيضًا، لكن المترجم لم يكن ذكيًا بما يكفي لتحذيرك من الفخ الذي قد تقع فيه إذا استخدمت إحدى الطرق التي يحذرك منها.