ربط C ++ DLL غير المدير مع مكتبة فئة C ++ المدارة

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

  •  25-09-2019
  •  | 
  •  

سؤال

كما في السؤال إنشاء C ++ بسيط. غلاف شبكة. خطوة بخطوة

أنا أتعامل مع فئات C ++ في .NET ولكني أواجه مشاكل في البناء في Visual Studio (2008).

لدي فئة A غير مُدارة (C ++ تم تجميعها مع /CLR). لقد قمت بإنشاء فئة C ++/CLR "Class1" التي تلتف A ومع طريقة المطابقة المندوبين لأساليب A.

إذا قمت بتضمين ملف مصدر وحدة الفئة A في مشروع مكتبة الفصل الدراسي (المُدار) ، فليس لدي أي مشاكل في كل شيء على صلات ويعمل بشكل جيد ، لكن لدي العديد DLL إلى المكتبة المدارة (من أغلفة الفصل). [في الواقع لا أرى حاجة إلى ربط هذه DLL معًا في هذه المرحلة ، ولكن يبدو أن المترجم يتطلب ذلك ، مع إعطاء نفس الأخطاء الموضحة أدناه.

لقد قمت بإنشاء مكتبة VisualC ++ / CLR / Class وأضفت فئة C ++ الخاصة بي (مدرج أدناه) وبناء. [لقد استخدمت الإعدادات الافتراضية ولكن في إعدادات رابط المشروع ، جربت كلا من الإخراج مع نعم ولا.] لم تكن هناك أخطاء وتم إنشاء ملف .dll.

لقد قمت بإنشاء مكتبة VisualC ++ / CLR / Class وقمت بإنشاء فئة Wrapper 'Class1' لقد استخدمت جميع الإعدادات الافتراضية. ضمن خصائص المشروع ، قمت بالنقر فوق "المراجع" "إضافة مرجع جديد" وحددت DLL تم إنشاؤها في الخطوة الأولى.

أحصل على أخطاء رابط:

test_NET_library.obj : error LNK2028: unresolved token (0A000009) "public: int __thiscall Z::A::m1(int,int)" (?m1@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m1(int,int)" (?m1@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2028: unresolved token (0A00000A) "public: int __thiscall Z::A::m2(int,int)" (?m2@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m2(int,int)" (?m2@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2019: unresolved external symbol "public: int __thiscall Z::A::m1(int,int)" (?m1@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m1(int,int)" (?m1@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2019: unresolved external symbol "public: int __thiscall Z::A::m2(int,int)" (?m2@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m2(int,int)" (?m2@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
C:\temp\test_Cpp_CLI\test_NET_library\Debug\test_NET_library.dll : fatal error LNK1120: 4 unresolved externals

نفس الأخطاء كما لو قمت بإزالة A.CPP في مشروع مكتبة فئة Wrapper (الخيار الذي يعمل). لا أفهم لماذا يحاول البناء حل العوامل الخارجية في المقام الأول لأن هذه مكتبة ، وليس برنامجًا.

هل هناك شيء آخر أحتاج إلى إضافته إلى خصائص مشروع مكتبة Wrapper أو تسجيل DLL للفصول غير المدارة أو خيارات التحويل البرمجي؟ هل أحتاج أيضًا إلى ملف .lib للذهاب مع DLL؟ (لا يظهر ملف LIB في الدليل المستهدف للمشاريع)

هل لا يزال يتعين علي استخدام __declspec (dllexport) [يعتقد أنه كان فقط لوظائف النمط C وليس أعضاء الفصل.] كما في السؤال: تصدير فصول غير مُدارة من DLL C ++ Visual؟على الرغم من أن مكتبة C ++ غير المدارة يتم تجميعها مع تمكين CLR.

(حاولت أيضًا التجميع كمكتبة ثابتة ، لكن لا يمكنني معرفة كيفية إضافة ملف .lib إلى مشروع مكتبة فئة CLR).

فصل الاختبار الخاص بي

namespace Z 
{
class A
{
public:

   int m1(int p1, int p2);
   int m2(int p3, int p4);
};
};

مع التنفيذ:

#include "A.h"
namespace Z 
{
int A::m1(int p1, int p2) { return p1+p2; };
int A::m2(int p3, int p4) { return p3 * p4; };
};

وفئة الغلاف

#pragma once
#include "../A.h"
using namespace System;
namespace test_NET_library {
 public ref class Class1
 {
 private: Z::A *a;
 public: Class1()
  : a(new Z::A)
   {}
 public: inline int m1(int p1, int p2)
  {  return a->m1(p1,p2);
  };
 public: inline int m2(int p3, int p4)
  {return a->m2(p3,p4);
  };
 };
}

حسب السؤال: C ++/CLI وضع مختلط DLLلقد حاولت أيضا:

#pragma managed(push, off) 
#include "../A.h"
#pragma managed(pop)

وأيضا هذا الضغط المدارة حول A.CPP.

تحديث: وفقًا لاستجابة McDave ، قمت بإزالة /clr التي أنتجت DLL ، والآن كيف يمكنني إتاحة DLL لهذا test_net_library؟

جربت المراجع/إضافة مرجع جديد ، وحددت هذا DLL الجديد ؛ وحصلت على الرسالة "لا يمكن إضافة مرجع إلى ملف" C: .. undaraged_lib.dll "لأنه ليس مجموعة .NET أو التحكم ActiveX مسجل.". تمت إضافة DLL إلى قائمة ملفات المشروع ، ولكن يبدو أن المترجم يتجاهله.

حاولت إضافة/عنصر موجود وحددت DLL الجديد. لكن ملفات .dll ليست نوع ملف قابل للتحديد.

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

المحلول

مع تلميحات قليلة من التحديث الخاص بك ، سأحاول تخمينين ...

  1. عندما يكون undaraged_lib عبارة عن lib مرتبط بشكل ثابت ، هل قمت بتعيين مشروع ungaraged_lib ليكون اعتمادًا على test_net_library؟ (في نافذة Explorer Project ، انقر بزر الماوس الأيمن على test_net_library ، وحدد "تبعيات المشروع ..." وحدد undaraged_lib.)
  2. عندما يكون undaraged_lib هو DLL ، تحتاج إلى تصدير الفصل من DLL عن طريق المتابعة هذه الإجابة وأيضًا اجعل test_net_library تعتمد على مشروع ungaraged_lib.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top