سؤال

ما هي الخيارات عندما يتعلق الأمر باستخدام DLL .NET من عملية Win32؟ أنا بحاجة إلى استخدام أساسا C # DLL من عملية Win32.

ولدي حل ممكن في الوقت الراهن الذي يتطلب إضافة C # DLL إلى GAC (باستخدام RegAsm.exe)، ثم استدعاء C # DLL COM عبر ملفوفة المكالمات. لكن هذا الحل هو ثقيل جدا. ويتطلب ذلك أن صافي DLL أن تضاف إلى GAC على كل الآلات التي من المفترض أن تعمل هذه عملية Win32.

وسيكون من الممكن القيام بذلك دون الحاجة إلى استدعاء RegAsm قبل التمكن من استخدام C # DLL؟

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

المحلول

ويمكنك استخدام COM خالية من التسجيل مع مكونات COM. NET - راجع <لأ href = "http://msdn.microsoft.com/en-us/library/eew13bza(VS.71).aspx" يختلط = " noreferrer "> هنا .

وثمة خيار آخر هو استخدام C ++ / CLI كجسر. الناس في الغالب على دراية استخدامه للالتفاف واجهات برمجة التطبيقات غير المدارة لفضح إلى التعليمات البرمجية المدارة، ولكنه في الواقع يعمل في كلا الاتجاهين - من الممكن ترجمة مع /clr، وبعد إنتاج جمعية .dll حيث بلغت قيمة الصادرات غير المدارة واضحة، والتي يمكن استدعاؤها من التعليمات البرمجية غير المدارة كل عادة. وهنا مثال بسيط جدا أن يعرض System::String::ToUpper بهذه الطريقة:

// compile with cl.exe /clr /LD wrapper.cpp ole32.lib

#include <windows.h>

__declspec(dllexport)
wchar_t* ToUpper(const wchar_t* wcs)
{
    System::String^ s = gcnew System::String(wcs);
    array<wchar_t>^ chars = s->ToUpper()->ToCharArray();

    size_t size = chars->Length * 2;
    wchar_t* dst = (wchar_t*)CoTaskMemAlloc(size + 2);
    pin_ptr<wchar_t> src = &chars[0];
    memcpy(dst, src, size);
    dst[chars->Length] = 0;
    return dst;
}

وهذا سوف ينتج wrapper.dll - تمكن الهجين / التجمع غير المدارة - وwrapper.lib مكتبة التصدير. وهذه الأخيرة يمكن استخدامها في التطبيق الأصلي النقي كما يلي:

// compile with cl.exe test.cpp ole32.lib wrapper.lib
// note, no /clr

#include <stdio.h>
#include <windows.h>

wchar_t* ToUpper(const wchar_t* wcs);

int main()
{
    wchar_t* s = ToUpper(L"foo");  
    wprintf(L"%s", s);
    CoTaskMemFree(s);
}

في واقع الامر انه سيتم تحميل CLR وقت في عملية الاستدعاء (إلا انها بالفعل تحميلها هناك) وإرسالها من التعليمات البرمجية الأصلية إلى التعليمات البرمجية المدارة بشفافية - ويتم كل السحر من قبل C ++ / CLI مترجم

نصائح أخرى

وهناك نوعان من الخيارات.

أولا، يمكنك استخدام تسجيل مجاني COM إمكانية التشغيل المتداخل .

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

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