چرا وارد کردن مستقیم کتابخانه .NET در Python شکست می‌خورد

اگر تا به حال سعی کرده‌اید GroupDocs.Search for .NET را مستقیماً با استفاده از pythonnet به Python وارد کنید، احتمالاً با یک ReflectionTypeLoadException ناامیدکننده مواجه شده‌اید. کتابخانه به سادگی بارگذاری نمی‌شود و باعث می‌شود تعجب کنید چرا چنین راه‌حل قدرتمند جستجوی سندی با Python ناسازگار به نظر می‌رسد.

در این راهنمای جامع، شما دو روش ثابت برای یکپارچه‌سازی موفق GroupDocs.Search for .NET با Python را یاد خواهید گرفت، که چالش اصلی بارگذاری اسمبلی‌های مبهم‌شده با وابستگی‌های تعبیه‌شده را پشت سر می‌گذارند. هر روش سطوح مختلفی از کنترل و پیچیدگی را ارائه می‌دهد، از APIهای ساده مبتنی بر Wrapper تا حل کامل دستی نوع.

آنچه یاد خواهید گرفت:

  • چرا GroupDocs.Search در محیط‌های Python به‌صورت مستقیم بارگذاری نمی‌شود
  • نحوه پیاده‌سازی ۲ روش کاری برای یکپارچه‌سازی Python
  • نمونه کدهای کامل که می‌توانید بلافاصله در پروژه‌های خود استفاده کنید
  • دستورالعمل‌های گام‌به‌گام برای تنظیم در هر دو محیط Windows و چندسکویی
  • چه زمانی از هر رویکرد برای موارد استفاده خاص خود استفاده کنید

دانلود نمونه‌های کامل کد

تمام نمونه‌های کدی که در این مقاله نمایش داده شده‌اند در مخزن رسمی GitHub ما در دسترس هستند. می‌توانید مخزن را کلون، دانلود یا مرور کنید تا مثال‌های کامل کاری را برای شروع پیاده‌سازی جستجوی سند در پروژه‌های Python خود داشته باشید.

🔗 لینک مخزن

نمونه‌های یکپارچه‌سازی GroupDocs.Search با Python

چالش اصلی: حل وابستگی‌ها در Python

چرا وارد کردن مستقیم شکست می‌خورد

GroupDocs.Search برای .NET از مبهم‌سازی و وابستگی‌های تعبیه‌شده برای حفاظت از مالکیت فکری استفاده می‌کند. این مسأله یک چالش اساسی هنگام تلاش برای استفاده مستقیم از آن با pythonnet ایجاد می‌کند:

# ❌ This approach WILL NOT work
import os
import sys

# Load coreclr first
from pythonnet import load
load("coreclr")

import clr

# Add folder with the library and dependencies to the system path
dll_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "dlls"))
sys.path.append(dll_dir)

# Add reference to the library
clr.AddReference("GroupDocs.Search")
# Import the Index class
from GroupDocs.Search import Index
index = Index("search_index")
index.Add("documents_folder")

تحلیل ریشه‌ای مشکل

مشکل: GroupDocs.Search اسمبلی‌های مرجع (مانند کتابخانه‌های Aspose.*) را مستقیماً داخل DLL اصلی با مبهم‌سازی تعبیه می‌کند. وقتی pythonnet سعی می‌کند اسمبلی را بارگذاری کند:

  1. مرحلهٔ شمارش انواع: pythonnet سعی می‌کند تمام انواع عمومی را برای ساخت پروکسی‌های ماژول Python فهرست کند
  2. حل وابستگی‌ها: در زمان شمارش، CLR سعی می‌کند وابستگی‌های تعبیه‌شده را حل کند
  3. نقطهٔ شکست: حل‌کنندهٔ پیش‌فرض اسمبلی .NET نمی‌تواند DLLهای مبهم‌شده و تعبیه‌شده را از منابع استخراج کند
  4. نتیجه: ReflectionTypeLoadException پرتاب می‌شود و باعث می‌شود pythonnet نتواند ماژول Python را ایجاد کند

چرا این اتفاق می‌افتد:

  • اکثر مبهم‌سازها به یک بوت‌استرپ/حل‌کنندهٔ وابستگی تکیه دارند که در اسمبلی ورودی شما اجرا می‌شود
  • از آنجا که Python میزبان است (نه یک اجرایی .NET)، بوت‌استرپ هرگز اجرا نمی‌شود
  • وابستگی‌های تعبیه‌شده برای حل‌کنندهٔ استاندارد .NET غیرقابل دسترسی می‌مانند

روش ۱: رویکرد مبتنی بر Wrapper (یکپارچه‌سازی ساده‌شده)

سطح پیچیدگی: کم | سطح کنترل: API سطح‑بالا | بهترین برای: نمونه‌سازی سریع و گردش کارهای جستجوی ساده

رویکرد مبتنی بر Wrapper از یک کتابخانهٔ سفارشی C# استفاده می‌کند که عملیات جستجوی رایج را در بر می‌گیرد و متدهای ایستاتیک ساده‌ای ارائه می‌دهد. این روش حل وابستگی‌ها را به‌صورت داخلی مدیریت می‌کند و برای وظایف جستجوی ساده با کمترین پیچیدگی تعامل Python/.NET ایده‌آل است.

چگونگی کار: کتابخانهٔ Wrapper به‌عنوان پلی بین Python و GroupDocs.Search عمل می‌کند، تمام حل وابستگی‌های پیچیده را به‌صورت داخلی انجام می‌دهد و API‌های تمیز و ساده‌ای برای استفادهٔ Python ارائه می‌دهد.

// C# Wrapper Implementation (SearchWrapper.cs)
using GroupDocs.Search;
using System;
using System.IO;

public static class SearchWrapper
{
    public static void BuildIndex(string indexPath, string documentsPath)
    {
        using (var index = new Index(indexPath))
        {
            index.Add(documentsPath);
        }
    }
    
    public static string[] SearchDocuments(string indexPath, string query)
    {
        using (var index = new Index(indexPath))
        {
            var searchResult = index.Search(query);
            var results = new string[searchResult.Count];
            for (int i = 0; i < searchResult.Count; i++)
            {
                results[i] = searchResult[i].DocumentInfo.FileName;
            }
            return results;
        }
    }
}
# Python Usage (run_search_wrapper.py)
import os
import sys
import clr

# Add the dlls directory to the path
dll_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "dlls"))
sys.path.append(dll_dir)

# Load coreclr
from pythonnet import load
load("coreclr")

# Add reference to the wrapper
clr.AddReference("GroupDocs.Search.Wrapper")

# Import the wrapper class
from GroupDocs.Search.Wrapper import SearchWrapper

# Use the simplified API
SearchWrapper.BuildIndex("index", "files")
results = SearchWrapper.SearchDocuments("index", "invoice")
print(f"Found {len(results)} documents: {results}")

چرا این رویکرد کار می‌کند

کتابخانهٔ Wrapper در یک زمینهٔ .NET اجرا می‌شود که در آن بوت‌استرپ مبهم‌سازی می‌تواند به‌درستی اجرا شود. این کتابخانه تمام حل وابستگی‌های پیچیده را به‌صورت داخلی انجام می‌دهد، سپس متدهای ایستاتیک ساده‌ای را افشا می‌کند که Python می‌تواند بدون نگرانی دربارهٔ پیچیدگی‌های زیرین صدا بزند.

نمونهٔ عملی رویکرد Wrapper:

یکپارچه‌سازی GroupDocs.Search مبتنی بر Wrapper در Python

زمان استفاده از این روش: نمونه‌سازی سریع، گردش کارهای جستجوی ساده، و کاربرانی که ترجیح می‌دهند APIهای سطح‑بالا بدون نیاز به کنترل دقیق پارامترهای جستجو داشته باشند.

روش ۲: رویکرد حل دستی نوع (کنترل کامل)

سطح پیچیدگی: متوسط | سطح کنترل: کامل | بهترین برای: سناریوهای جستجوی پیچیده و سفارشی‌سازی پیشرفته

رویکرد حل دستی نوع از Wrapper فقط به‌عنوان حل‌کنندهٔ وابستگی برای اسمبلی‌های تعبیه‌شده استفاده می‌کند، سپس دسترسی مستقیم به انواع و متدهای GroupDocs.Search را فراهم می‌آورد. این به شما امکان کنترل کامل بر ایجاد ایندکس و سفارشی‌سازی جستجو را می‌دهد.

چگونگی کار: Wrapper حل وابستگی‌ها را بر عهده می‌گیرد، سپس با استفاده از reflection به‌صورت مستقیم به انواع GroupDocs.Search دسترسی پیدا می‌کنید، به‌طرزی که مشکلات وارد کردن دورزدن می‌شود و همچنان به تمام API دسترسی دارید.

# Manual Type Resolution (run_search_manual.py)
import os
import sys
import clr

# Add the dlls directory to the path
dll_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "dlls"))
sys.path.append(dll_dir)

# Load coreclr
from pythonnet import load
load("coreclr")

# Add reference to the wrapper (for dependency resolution)
clr.AddReference("GroupDocs.Search.Wrapper")

# Now add reference to the main library
clr.AddReference("GroupDocs.Search")

# Import System for reflection
import System
from System import Type, Activator, Array

# Get the Index type using reflection
index_type = Type.GetType("GroupDocs.Search.Index, GroupDocs.Search")

# Create index instance
index_path = "index"
index_instance = Activator.CreateInstance(index_type, index_path)

# Get the Add method
add_method = index_type.GetMethod("Add", [System.String])
add_method.Invoke(index_instance, ["files"])

# Get the Search method
search_method = index_type.GetMethod("Search", [System.String])
search_result = search_method.Invoke(index_instance, ["invoice"])

# Process search results
result_count = search_result.Count
print(f"Found {result_count} documents")

for i in range(result_count):
    document_info = search_result[i]
    file_name = document_info.DocumentInfo.FileName
    print(f"Document: {file_name}")

سفارشی‌سازی پیشرفته جستجو

با حل دستی نوع، می‌توانید به تمامی ویژگی‌های GroupDocs.Search دسترسی داشته باشید:

# Advanced search with custom options
def advanced_search_example():
    # Get SearchOptions type
    search_options_type = Type.GetType("GroupDocs.Search.Options.SearchOptions, GroupDocs.Search")
    search_options = Activator.CreateInstance(search_options_type)
    
    # Configure search options
    fuzzy_search_type = Type.GetType("GroupDocs.Search.Options.FuzzySearch, GroupDocs.Search")
    fuzzy_search = Activator.CreateInstance(fuzzy_search_type)
    fuzzy_search.Enabled = True
    fuzzy_search.SimilarityLevel = 0.8
    
    # Set fuzzy search in options
    set_fuzzy_method = search_options_type.GetMethod("set_FuzzySearch")
    set_fuzzy_method.Invoke(search_options, [fuzzy_search])
    
    # Perform advanced search
    search_method = index_type.GetMethod("Search", [System.String, search_options_type])
    results = search_method.Invoke(index_instance, ["confidential", search_options])
    
    return results

نمونهٔ عملی رویکرد دستی با کنترل کامل:

حل دستی نوع با کنترل کامل بر GroupDocs.Search

زمان استفاده از این روش: سناریوهای جستجوی پیچیده، سفارشی‌سازی پیشرفته، و توسعه‌دهندگانی که نیاز به کنترل دقیق‌تری بر تمام ویژگی‌های GroupDocs.Search دارند.

راهنمای کامل راه‌اندازی

پیش‌نیازها

نیازمندی‌های سیستم:

  • سیستم عامل: Windows 10/11 (x64)، Linux یا macOS
  • Python: 3.8+ (پیشنهاد شده: 3.11 یا 3.12)
  • Runtime .NET: .NET 6.0 یا بالاتر
  • حافظه: حداقل 4GB RAM (برای اسناد بزرگتر 8GB+ توصیه می‌شود)
  • فضای دیسک: 500MB+ برای وابستگی‌ها و فایل‌های موقت

ماتریکس سازگاری Python ↔ pythonnet ↔ .NET

نسخهٔ Python نسخهٔ pythonnet Runtime .NET چارچوب‌های هدف پشتیبانی‌شده نکات
3.7 – 3.10 2.5.x .NET Framework 4.6.2 – 4.8 net40, net45, net462, net48 بهترین برای DLLهای .NET Framework قدیمیبه Python 64‑بیت + Runtime .NET Framework نیاز دارد
3.8 – 3.12 3.x (≥3.0.0) .NET 6 / .NET 7 / .NET 8 net6.0, net7.0, net8.0, netstandard2.0/2.1 بهترین برای ساخت‌های مدرن .NETبه .NET Desktop Runtime 6+ نیاز دارد
3.13+ 3.x (≥3.0.3) .NET 6 / .NET 7 / .NET 8 همانند بالا پشتیبانی می‌شودبرای آخرین نسخه‌های Python توصیه می‌شود

نصب گام‌به‌گام

مرحله ۱: تنظیم محیط Python

# Create Python 3.11 virtual environment
py -3.11 -m venv venv311

# Activate virtual environment (Windows)
venv311\Scripts\activate

# Verify Python version
python --version

مرحله ۲: نصب وابستگی‌ها

# Upgrade pip and essential tools
python -m ensurepip --upgrade
python -m pip install --upgrade pip setuptools wheel

# Install pythonnet 3.0.5
python -m pip install pythonnet==3.0.5

# Install project requirements
pip install -r requirements.txt

مرحله ۳: ساخت کتابخانهٔ Wrapper

# Navigate to wrapper directory
cd wrapper

# Build and publish the wrapper
dotnet publish -c Release -r win-x64 --self-contained false -o ./../dlls

# Return to root directory
cd ..

مرحله ۴: اجرای نمونه‌ها

# Activate virtual environment (if not already active)
.venv\Scripts\activate

# Run wrapper-based approach
python run_search_wrapper.py

# Run manual type resolution approach
python run_search_manual.py

موارد استفاده واقعی

برنامه‌های تجاری

Document Discovery & Knowledge Management

  • موسسات حقوقی: جستجو در قراردادها، توافق‌نامه‌ها و اسناد حقوقی برای بندهای خاص
  • بهداشت و درمان: یافتن سوابق بیماران و اسناد پزشکی با استفاده از کلیدواژه‌ها و عبارات
  • آموزش: جستجو در مطالب دوره‌ها، مقالات پژوهشی و محتوای آموزشی
  • املاک و مستغلات: یافتن اسناد ملک، قراردادها و مشخصات با استفاده از عبارات جستجو

Enterprise Content Search

  • تولید: جستجو در مستندات فنی، مشخصات و اسناد کنترل کیفیت
  • خدمات مالی: یافتن اسناد انطباق، گزارش‌های حسابرسی و سوابق مالی
  • دولت: جستجو در اسناد سیاست‌ها، مقررات و مطالب اداری
  • بیمه: یافتن اسناد درخواست خسارت، اطلاعات بیمه‌نامه و ارزیابی‌های ریسک

موارد استفاده فنی

Automated Document Processing

  • ایندکس‌گذاری دسته‌ای: پردازش صدها سند و ایجاد ایندکس‌های جستجوپذیر
  • یکپارچه‌سازی API: افزودن قابلیت جستجو به عنوان بخشی از جریان‌های پردازش سند
  • سرویس‌های ابری: ادغام عملکرد جستجو در برنامه‌های مبتنی بر ابر
  • Microservices: استقرار سرویس جستجو به‌عنوان بخشی از سیستم‌های پردازش سند بزرگتر

Custom Search Workflows

  • پردازش فرم‌ها: جستجو در ارسال‌ها و پاسخ‌های فرم
  • تحلیل گزارش‌ها: یافتن داده‌ها و الگوهای خاص در گزارش‌های تولید شده
  • مقایسه اسناد: جستجو برای تفاوت‌های بین نسخه‌های مختلف سند
  • انطباق قالب: یافتن اسنادی که با معیارها یا قالب‌های خاص مطابقت دارند

همین امروز با GroupDocs.Search شروع کنید

آماده‌اید که قابلیت جستجوی قدرتمند سند را در برنامه‌های Python خود پیاده‌سازی کنید؟ این roadmap سریع برای شروع:

مرحله ۱: دریافت نسخه آزمایشی رایگان

دانلود و نصب GroupDocs.Search برای .NET از صفحهٔ انتشار رسمی انجام دهید. نیازی به کارت اعتباری نیست.

برای تست تمام ویژگی‌ها بدون محدودیت، یک مجوز موقت دریافت کنید که دسترسی کامل به API را فراهم می‌کند.

مرحله ۲: انتخاب رویکرد خود

  1. شروع با Wrapper: استفاده از رویکرد Wrapper برای نمونه‌سازی سریع و وظایف جستجوی ساده
  2. گسترش به دستی: انتقال به حل دستی نوع زمانی که به کنترل کامل بر سفارشی‌سازی جستجو نیاز دارید
  3. آزمون کامل: اعتبارسنجی با انواع سند و نیازهای جستجوی خاص خود
  4. نظارت بر عملکرد: ارزیابی کارایی با مجموعه‌های بزرگ اسناد و پرس‌و‌جوهای پیچیده

مرحله ۳: بررسی منابع بیشتر

سؤالات متداول

س: آیا GroupDocs.Search با تمام فرمت‌های سند کار می‌کند؟
ج: بله، از بیش از ۵۰ فرمت سند از جمله PDF، Word، Excel، PowerPoint، تصاویر و غیره پشتیبانی می‌کند.

س: آیا می‌توانم از این در محیط‌های تولید استفاده کنم؟
ج: بله، اما توصیه می‌کنیم پیش از استفاده در تولید، تست‌های جامع با موارد استفاده خاص خود انجام دهید.

س: آیا نیاز به نصب Microsoft Office دارم؟
ج: خیر. GroupDocs.Search یک کتابخانهٔ مستقل .NET است که بدون نیاز به Microsoft Office کار می‌کند.

س: تاثیر عملکرد روش wrapper چقدر است؟
ج: بارگذاری اضافی حداقل است. Wrapper لایهٔ نازکی اضافه می‌کند که تأثیر قابل توجهی بر عملکرد جستجو ندارد.

س: آیا می‌توانم Wrapper را با متدهای سفارشی گسترش دهم؟
ج: حتماً. Wrapper منبع باز است و می‌توانید آن را برای نیازهای خاص خود سفارشی کنید.

نتیجه‌گیری: انتخاب رویکرد مناسب یکپارچه‌سازی

GroupDocs.Search برای .NET امکانات قدرتمند جستجوی سند ارائه می‌دهد، اما یکپارچه‌سازی آن با Python مستلزم رفع چالش‌های حل وابستگی است. همان‌طور که نشان دادیم، دو رویکرد ثابت برای حل این مشکل وجود دارد:

  1. رویکرد مبتنی بر Wrapper – مناسب برای نمونه‌سازی سریع و گردش کارهای جستجوی ساده
  2. حل دستی نوع – ایده‌آل برای سناریوهای پیچیده که نیاز به کنترل کامل API دارند

کلید مطابقت رویکرد با پیچیدگی و نیازهای پروژه است. هر دو روش مسئلهٔ اصلی بارگذاری اسمبلی‌های مبهم‌شده با وابستگی‌های تعبیه‌شده را حل می‌کنند و به شما امکان می‌دهند قدرت کامل GroupDocs.Search را از برنامه‌های Python بهره‌برداری کنید.