Regasm وكوم إمكانية التشغيل المتداخل السلبيات كاذبة

StackOverflow https://stackoverflow.com/questions/1648972

  •  22-07-2019
  •  | 
  •  

سؤال

وأنا محاولة لفضح مكتبتنا عبر COM ولكن يبدو أن القتال الأدوات أكثر من المشكلة الفعلية. بغض النظر عن كيفية وأنا أكتب صفي يتعرض COM أحصل على التحذير: "XXX.DLL لا يحتوي على أي الأنواع التي يمكن تسجيلها عن إمكانية التشغيل المتداخل COM" (مشروع وضع علامة التسجيل لإمكانية التشغيل المتداخل COM في خصائص المشروع). حتى الطبقة البسيطة التالية (كما الطبقة الوحيدة في التجمع الذي تم توقيعه وتميز مع ComVisible (كاذبة)) لا يزال قائما يحذر:

  [Guid("77699130-7D58-4d29-BE18-385871B000D1")]
  [ComVisible(true)]
  public interface IExample
  {
    string GetText();
    void SetText(string text);
  }

  [Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")]
  [ComVisible(true)]
  public class Example : IExample
  {
    private string m_text = "default text";

    public string GetText()
    {
      return m_text;
    }

    public void SetText(string text)
    {
      m_text = text;
    }
  }

ولقد حاولت تشغيل regasm من سطر الأوامر على الانتاج الذي ينص بكل سرور "أنواع سجلت بنجاح". ومع ذلك، تعمل مع عرض التبديل / مطول أي معلومات إضافية (يبدو لي أن أذكر أنه يسرد اسم أو ربما مجرد عدد من أنواع مسجلة). حاول أيضا تشغيل regasm مع رمز التبديل / regfile لتوليد regfile الذي يولد هذا:

[HKEY_CLASSES_ROOT\ComExample.Example]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\ComExample.Example\CLSID]
@="{F91E5EE1-D220-43B5-90D1-A48E81C478B7}"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="ComExample.Example"
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32\1.0.0.0]
"Class"="ComExample.Example"
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\ProgId]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

وأنا لا المعالج COM أي تدبير ولكن تسجيل يبدو صحيحا بالنسبة لي. ومع ذلك، لا يبدو أن تظهر في التسجيل عند تشغيل regasm على التجميع.

وهكذا سؤالي هو ما إذا كان أنا في عداد المفقودين شيء في بلدي مثال بسيط لعمل تسجيل، أرى بيانات كاذبة وغير صحيحة على تسجيل الواقع وكيف يمكنني تحديد أفضل إذا كان تسجيل COM يعمل في الواقع

وتحرير: عن طريق التعديلات التي اقترحها كيلو لم أستطع تجنب تحذيرات من VS2008 لكنني في الواقع يمكن أن تحصل على شيء مسجل في التسجيل باستخدام regasm مباشرة (لا شيء في التسجيل من مجرد التكامل VS2008).

وحاولت بعد ذلك لإزالة فئة بسيطة لذلك اضطررت جمعية فارغة. تشغيل regasm على ذلك لم يقدم أي نوع من التحذيرات، فقط "أنواع سجلت بنجاح". أرى تحذيرات مثل "RegAsm: تحذير RA0000: لم يسجل أي أنواع" عند تشغيل RegAsm على بعض من بلدي المجالس الأخرى التي قد يتعرضون لها بشكل غير صحيح إلى COM. ما يجري هنا، يمكنني أن أثق أي شيء ما عدا التسجيل وماذا عن تشغيل / إيقاف تحذيرات من regasm؟

هل كانت مفيدة؟

المحلول

وأنا خلقت مشروع مكتبة فئة بناء على التعليمات البرمجية كما يلي:

في صفحة خصائص المشروع، حدد علامة التبويب توقيع. اضغط على مربع 'تسجيل التجميع "وحدد <New...> من' اختيار اسم واضح ملف المفتاح: 'المنسدلة مربع

وI ثم أضاف (Example.cs) الطبقة التالية:

[Guid("77699130-7D58-4d29-BE18-385871B000D1")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IExample
{
    [DispId(1)]
    string GetText();

    [DispId(2)]
    void SetText(string text);
}

[Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Example : IExample
{
    private string m_text = "default text";

    [ComVisible(true)]
    public string GetText()
    {
      return m_text;
    }

    [ComVisible(true)]
    public void SetText(string text)
    {
      m_text = text;
    }
}

وI ثم بناء مشروع ثم انخفض إلى سطر الأوامر حيث كان DLL الإخراج من الإنشاء.

لتسجيل:

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

وregasm.exe COMInteropTesting.dll /register /codebase /tlb

إذا مكون الخاص بك يجب أن يكون في متناول العديد من التطبيقات:

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

وgacutil.exe -i COMInteropTesting.dll

وهذا كله يعمل بشكل جيد على ويندوز 2003 32BIT و، ويندوز 2008 32bit و ويندوز 7 64 بت.

واحد مسكتك الرغم من أنه إذا كنت اختبار مكونات مع القول CSCRIPT على نظام 64 بت، تحتاج إلى تشغيل مترجم CSCRIPT الصحيح. إذا كنت تسجيل التجميع باستخدام RegAsm.exe 32BIT و(في C:\Windows\Microsoft.NET\Framework\v2.0.50727) فإنك تحتاج إلى تشغيل مترجم CSCRIPT 32 بت في c:\Windows\SysWOW64.

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