নিবন্ধভুক্ত সিওএমের জন্য ম্যানিফেস্ট ফাইলগুলি তৈরি করুন


87

আমার কাছে কিছু অ্যাপ্লিকেশন রয়েছে (কিছু নেটিভ, কিছু .NET) যা ম্যানিফেস্ট ফাইলগুলি ব্যবহার করে যাতে কোনও বিশ্বব্যাপী সিওএম নিবন্ধকরণের প্রয়োজন ছাড়াই সম্পূর্ণ বিচ্ছিন্নভাবে মোতায়েন করা যায় । উদাহরণস্বরূপ, dbgrid32.ocx com সার্ভারের উপর নির্ভরশীলতাটি myapp.exe.manifest ফাইলের নীচে হিসাবে ঘোষিত হয়েছে যা myapp.exe হিসাবে একই ফোল্ডারে বসে আছে:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity type="win32" name="myapp.exe" version="1.2.3.4" />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="dbgrid32.ocx" version="5.1.81.4" />
    </dependentAssembly>
  </dependency>
</assembly>

Dbgrid32.ocx এর নিজস্ব dbgrid32.ocx.manifest ফাইল সহ একই ফোল্ডারে স্থাপন করা হয়েছে:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity type="win32" name="dbgrid32.ocx" version="5.1.81.4" />
  <file name="dbgrid32.ocx">
     <typelib
        tlbid="{00028C01-0000-0000-0000-000000000046}"
        version="1.0"
        helpdir=""/>
    <comClass progid="MSDBGrid.DBGrid"
       clsid="{00028C00-0000-0000-0000-000000000046}"
       description="DBGrid  Control" />
  </file>
</assembly>

এটি সব ঠিকঠাক কাজ করে তবে এই ম্যানিফেস্ট ফাইলগুলি ম্যানুয়ালি বজায় রাখা কিছুটা ব্যথা। এই ফাইলগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন করার উপায় আছে? আদর্শভাবে আমি কেবল COM সার্ভারের (নেটিভ এবং .NET উভয়) তালিকার উপর অ্যাপ্লিকেশনটির নির্ভরতা ঘোষণা করতে চাই এবং তারপরে বাকীটি স্বয়ংক্রিয়ভাবে উত্পন্ন করা যাক। এটা কি সম্ভব?


+1 এছাড়াও: রেজিস্ট্রি ফ্রি
সিওএমের

আমি কি আমার নিজের ইনস্টল ফোল্ডারে ম্যানিফেস্ট ফাইল দ্বারা একটি উচ্চতর সংস্করণ mstscax.dll ব্যবহার করতে পারি?
উঠুন

হ্যাঁ (আপনি আরও বিশদ সহ একটি নতুন প্রশ্ন পোস্ট করতে চাইতে পারেন))
UUDdLrLrSs

@ ইউডিডিএলআরএলআরএস সুসংবাদ! : আমি এখানে একটি নতুন প্রশ্ন পোস্ট stackoverflow.com/questions/63575746/...
Acewind

উত্তর:


64

দেখে মনে হচ্ছে নিখুঁত সমাধানটি এখনও বিদ্যমান নেই। কিছু গবেষণা সংক্ষেপে:

আমার প্রকাশ করুন ( লিঙ্ক )

এই সরঞ্জামটি সিওএম নির্ভরতা সন্ধানের জন্য একটি ভিবি 6 প্রকল্প স্ক্যান করে, তবে এটি দেরীতে আবদ্ধ সিওএম নির্ভরতা (যেমন ক্রিয়েটওজেক্টের মাধ্যমে ব্যবহৃত হয়) ম্যানুয়াল ঘোষণাকে সমর্থন করে।

আকর্ষণীয়ভাবে যথেষ্ট, এই সরঞ্জামটি অ্যাপ্লিকেশন ম্যানিফেস্টের ভিতরে নির্ভরতা সম্পর্কে সমস্ত তথ্য রাখে। অ্যাপ্লিকেশন এক্স এবং এর নির্ভরতাগুলি একাধিক ফাইলের সমন্বয়ে একক সমাবেশ হিসাবে বর্ণনা করা হয়। আমি এটা বুঝতে পারিনি যে এর আগে সম্ভব হয়েছিল।

দেখতে খুব ভাল একটি টুলের মতো মনে হচ্ছে তবে 0.6.6 সংস্করণ অনুসারে এর নিম্নলিখিত সীমাবদ্ধতা রয়েছে:

  • শুধুমাত্র ভিবি 6 অ্যাপ্লিকেশনগুলির জন্য, ভিবি 6 প্রকল্প ফাইল থেকে শুরু হয়। লজ্জাজনক, কারণ এটি যা কিছু করে তা আসলে ভিবি 6 এর সাথে কিছুই করার নেই।
  • উইজার্ড শৈলী অ্যাপ্লিকেশন, একটি বিল্ড প্রক্রিয়া একীকরণ উপযুক্ত নয়। আপনার নির্ভরতা যদি খুব বেশি পরিবর্তন না হয় তবে এটি কোনও বিশাল সমস্যা নয়।
  • উত্স ছাড়াই ফ্রিওয়্যার, এর উপর নির্ভর করা ঝুঁকিপূর্ণ কারণ এটি যে কোনও মুহুর্তে পরিত্যক্ত হয়ে যেতে পারে।

এটি। নেট কম লাইব্রেরি সমর্থন করে কিনা তা পরীক্ষা করিনি।

regsvr42 ( কোডপোজেক্ট লিঙ্ক )

এই কমান্ড লাইন সরঞ্জামটি দেশীয় COM লাইব্রেরির জন্য ম্যানিফেস্ট ফাইল উত্পন্ন করে। এটি DllRegisterServer কে আহ্বান করে এবং তারপরে স্ব-নিবন্ধকরণের জন্য গুপ্তচরবৃত্তি করায় এটি রেজিস্ট্রিতে তথ্য যুক্ত করে। এটি অ্যাপ্লিকেশনগুলির জন্য একটি ক্লায়েন্ট ম্যানিফেস্ট জেনারেট করতে পারে।

এই ইউটিলিটি .NET COM গ্রন্থাগারগুলিকে সমর্থন করে না, যেহেতু এগুলি কোনও DllRegisterServer রুটিন প্রকাশ করে না।

ইউটিলিটি সি ++ এ লেখা আছে। উত্স কোড উপলব্ধ।

mt.exe

উইন্ডোজ এসডিকে ( এমএসডিএন থেকে ডাউনলোড করা যেতে পারে ) এর কিছু অংশ, আপনার যদি ভিজ্যুয়াল স্টুডিও ইনস্টল করা থাকে তবে ইতিমধ্যে এটি আপনার কাছে রয়েছে। এটি এখানে নথিভুক্ত করা হয় । আপনি এর সাথে এর মতো নেটিভ সিওএম লাইব্রেরির জন্য ম্যানিফেস্ট ফাইলগুলি তৈরি করতে পারেন:

mt.exe -tlb:mycomlib.ocx -dll:mycomlib.ocx -out:mycomlib.ocx.manifest

আপনি এটির মতো নেট নেট সিএম লাইব্রেরির জন্য ম্যানিফেস্ট ফাইলগুলি তৈরি করতে পারেন:

mt.exe -managedassemblyname:netlib.dll -nodependency -out:netlib.dll.manifest

তবে এই সরঞ্জামটির সাথে কিছু সমস্যা রয়েছে:

  • প্রথম স্নিপেট প্রগ্রেড বৈশিষ্ট্য তৈরি করবে না, ক্লায়েন্টদের ভেঙে দেবে যা প্রগ্রেসের সাথে ক্রিয়েটওজেক্ট ব্যবহার করে।
  • দ্বিতীয় স্নিপেটটি উত্পন্ন করবে <runtime>এবং <mvid>উপাদানগুলি প্রকাশের আগে প্রকাশিত হওয়ার আগে উপাদানগুলি ছিনিয়ে নেওয়া দরকার।
  • অ্যাপ্লিকেশনগুলির জন্য ক্লায়েন্টের উদ্ভাস সমর্থন করে না।

হয়তো ভবিষ্যতে এসডিকে প্রকাশের ফলে এই সরঞ্জামটি উন্নত হবে, আমি উইন্ডোজ এসডিকে .0.০ এ (ভিস্তা) এর একটি পরীক্ষা করেছি।


4
আমি মনে করি আপনি একটি বিকল্প মিস করেছেন: mazecomputer.com তবে ওয়েব সাইটটি বর্ণনা করে না সে সম্পর্কে আমি কিছুই জানি না।
বব

এমএমএম নন-সিওএম (স্ট্যান্ডার্ড) ডিএলএলগুলিও পুনর্নির্দেশ করবে। আমি নিশ্চিত নই যে অন্যান্য সরঞ্জামগুলি এটি করে।
বব

নার্ভাসের জন্য কেবল একটি নোট: এমএমএমের উত্স প্রকাশিত হয়েছে। নেতিবাচক দিক থেকে এটি প্রদর্শিত হবে কারণ লেখক এতে কাজ করা বন্ধ করার সিদ্ধান্ত নিয়েছেন। এখনও একটি ইতিবাচক চিহ্ন।
গ্যাভিন

4
এমএমএমের জন্য সাইটটি দীর্ঘতর তবে সোর্স কোডটি যে জায়গায় রেখেছিল তা এখনও v0.9 এবং v0.12 এর জন্য উপলব্ধ ।
স্কট চেম্বারলাইন

4
উপরে বর্ণিত হিসাবে নেট নেট সিএম লাইব্রেরির জন্য কেবল এমটি.এক্স.এই চেষ্টা করেছেন এবং এটি v7.1A ব্যবহার করে ম্যানিফেস্টে কোনও পরিবর্তন ছাড়াই কাজ করেছে। এছাড়াও, এমএমএমের লিঙ্কগুলি কাজ করে না তবে আনটেনটেড মেইক মাই ম্যানিফেস্টটি মনে হয় একটি ভাল কাজ করেছে।
bzuillsmith

29

এমএস বিল্ড টাস্কটি জেনারেট অ্যাপ্লিকেশন ম্যানিফেস্টের সাহায্যে আমি কমান্ড লাইনে ম্যানিফেস্টটি ভিজ্যুয়াল স্টুডিওর উত্স হিসাবে তৈরি করেছি generated আমার সন্দেহ হয় ভিজ্যুয়াল স্টুডিওটি নির্মাণের সময় জেনারেট অ্যাপ্লিকেশন ম্যানিফেস্ট ব্যবহার করে । নীচে আমার বিল্ড স্ক্রিপ্ট যা এমসবিল্ড "এমএসবিল্ড বিল্ড.এক্সএমএল" ব্যবহার করে কমান্ড লাইন থেকে চালানো যেতে পারে

ডেভ টেম্পলিন এবং তার পোস্টকে ধন্যবাদ যে আমাকে জেনারেট অ্যাপ্লিকেশন ম্যানিফেস্ট টাস্ক এবং এমএসডিএন এর কার্যের আরও ডকুমেন্টেশন নির্দেশ করেছে

build.xml

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Build">
        <ItemGroup>
            <File Include='MyNativeApp.exe'/>
            <ComComponent Include='Com1.ocx;Com2.ocx'/>
        </ItemGroup>
        <GenerateApplicationManifest
            AssemblyName="MyNativeApp.exe"
            AssemblyVersion="1.0.0.0"
            IsolatedComReferences="@(ComComponent)"
            Platform="x86"
            ManifestType="Native">
            <Output
                ItemName="ApplicationManifest"
                TaskParameter="OutputManifest"/>
        </GenerateApplicationManifest>
    </Target>   
</Project>

4
আমি মনে করি এটি সত্যই এই প্রশ্নের উত্তর হিসাবে চিহ্নিত করা উচিত। আমি এখন আমাদের প্রকাশিত সমস্ত প্রজন্মকে স্বয়ংক্রিয় করতে এটি ব্যবহার করছি। আপনাকে ধন্যবাদ @ এমসিডন, আপনি আমাকে অনেক কাজ বাঁচিয়েছেন।
পিট ম্যাগসিগ

আমি সম্মত হই যে ভিজ্যুয়াল স্টুডিওতে তৈরি করার সময় এটিই সেরা সমাধান। এটি কেবলমাত্র উচ্চতর হিসাবে রেট করা হয়নি কারণ এটি অন্যান্য উত্তরগুলির চেয়ে অনেক পরে পোস্ট করা হয়েছিল
dschaeffer

এটি কীভাবে সিএসপিজে যুক্ত করব?
jle

@ জলে আমি মনে করি আপনি এটি আফটার বিল্ড টার্গেটে আপনার সিএসপিজে যুক্ত করতে পারেন। এখানে এমএসডিএন থেকে একটি লিঙ্ক , এবং প্রাক-বিল্ড এবং পোস্টবিল্ড ইভেন্টগুলির বিষয়ে অন্য একটি পোস্ট another দ্রষ্টব্য আমি সিএসপিজে এইগুলি সহ পরীক্ষা করিনি, তবে আমার সন্দেহ হয় এটি কার্যকর হবে।
ম্যাকডন

4
11 বছর পার্টিতে দেরি হলেও উল্লেখ করার জন্য ধন্যবাদ!
ডেভ টেম্পলিন

9

এটি করার জন্য মেক ম্যানিফেস্ট (এমএমএম) একটি দুর্দান্ত সরঞ্জাম। আপনার সমস্ত ডিএলএল / ওসিএক্স ফাইলগুলি mt.exe ব্যবহার করে প্রত্যেকের জন্য একটি ম্যানিফেস্ট তৈরি করতে প্রক্রিয়া করার জন্য একটি স্ক্রিপ্ট লেখা সম্ভব এবং তারপরে সেগুলি সমস্ত একত্রিত করে। এমএমএম সাধারণত ভাল / সহজতর হয়, কারণ এটি প্রচুর বিশেষ / অদ্ভুত ক্ষেত্রে পরিচালনা করে।


4
আমি এই এমএমএম জিনিসটি সম্পর্কে কিছুটা ঘাবড়েছি; এটি কেবল একটি ব্লগ, ফ্রিওয়্যার তবে কোনও সোর্স কোড উপলভ্য নয়, কেবলমাত্র একটি "স্ব-উত্তোলনকারী এক্সাই" এর লিঙ্ক এবং এক্সপি ক্র্যাশ হওয়ার কারণ হিসাবে ইউটিলিটি সম্পর্কে মন্তব্যগুলি দেখতে পাচ্ছি। মিমি ...
উইম কয়েনেন

এই "ক্র্যাশগুলি" এমএমএম ইউটিলিটি নিজেই মারা যাচ্ছিল। এটি 0.6.5 সংস্করণে ঠিক করা হয়েছিল তবে আপনি 0.6.6 চাইবেন, কারণ বিটা থাকাকালীন এটি আর শেষ হয় না। ইতিমধ্যে প্রস্তাবিত হিসাবে আপনি পরিবর্তে সর্বদা MT.EXE ব্যবহার করতে পারেন।
বব

আমি যখন dbgrid32.ocx এর মতো নেটিভ কম সার্ভারে এটি ব্যবহার করি তখন mt.exe প্রগিড তৈরি করে না
উইম

.NET সঙ্গে REG বিনামূল্যে এর COM ব্যবহারের রচনা উপাদান দৃশ্যত এক্সপি বিপর্যস্ত কারণ পারে - এই দেখতে stackoverflow.com/questions/617253/...
MarkJ

8

আপনি স্বয়ংক্রিয় বিল্ডগুলিতে সরাসরি উদ্ভাসিত করতে জেনারেট মেক মেনিফেস্ট স্পিন বন্ধ ব্যবহার করতে পারেন । নির্ভরশীল COM উপাদান যুক্ত করতে এটি স্ক্রিপ্ট ফাইল ব্যবহার করে। এটি উপলব্ধ কমান্ডগুলির সাথে নমুনা আইএনআইয়ের একটি অংশ:

# Unattended MMM script
#
# Command names are case-insensitive. Reference of supported commands:
#
# Command: Identity
#
#   Appends assemblyIdentity and description tags.
#
#   Parameters       <exe_file> [name] [description]
#      exe_file      file name can be quoted if containing spaces. The containing folder 
#                    of the executable sets base path for relative file names
#      name          (optional) assembly name. Defaults to MyAssembly
#      description   (optional) description of assembly
#
# Command: Dependency
#
#   Appends dependency tag for referencing dependent assemblies like Common Controls 6.0, 
#     VC run-time or MFC
#
#   Parameters       {<lib_name>|<assembly_file>} [version] [/update]
#     lib_name       one of { comctl, vc90crt, vc90mfc }
#     assembly_file  file name of .NET DLL exporting COM classes
#     version        (optional) required assembly version. Multiple version of vc90crt can
#                    be required by a single manifest
#     /update        (optional) updates assembly_file assembly manifest. Spawns mt.exe
#
# Command: File
#
#   Appends file tag and collects information about coclasses and interfaces exposed by 
#     the referenced COM component typelib.
#
#   Parameters       <file_name> [interfaces]
#     file_name      file containing typelib. Can be relative to base path
#     interfaces     (optional) pipe (|) separated interfaces with or w/o leading 
#                    underscore
#
# Command: Interface
#
#   Appends comInterfaceExternalProxyStub tag for inter-thread marshaling of interfaces
#
#   Parameters       <file_name> <interfaces>
#     file_name      file containing typelib. Can be relative to base path
#     interfaces     pipe (|) separated interfaces with or w/o leading underscore
#
# Command: TrustInfo
#
#   Appends trustInfo tag for UAC user-rights elevation on Vista and above
#
#   Parameters       [level] [uiaccess]
#     level          (optional) one of { 1, 2, 3 } corresponding to { asInvoker, 
#                    highestAvailable, requireAdministrator }. Default is 1
#     uiaccess       (optional) true/false or 0/1. Allows application to gain access to 
#                    the protected system UI. Default is 0
#
# Command: DpiAware
#
#   Appends dpiAware tag for custom DPI aware applications
#
#   Parameters       [on_off]
#     on_off         (optional) true/false or 0/1. Default is 0
#
# Command: SupportedOS
#
#   Appends supportedOS tag
#
#   Parameters       <os_type>
#     os_type        one of { vista, win7 }. Multiple OSes can be supported by a single 
#                    manifest
#

এটি 32 বা 64 বিট উইন্ডোতে চলবে।


+1 আকর্ষণীয়, বিশেষত কারণ উত্স কোড উপলব্ধ। নামের সাথে মিলের কারণে আমি কিছুটা বিভ্রান্ত হয়েছি, স্পষ্টতই "আমার প্রকাশ করুন" এবং "অপ্রত্যাশিতভাবে আমার প্রকাশিত করুন" বিভিন্ন লেখকের বিভিন্ন সরঞ্জাম।
উইম কয়েনেন

4
দ্রষ্টব্য - 2017 এর হিসাবে (8 বছর অবধি ...) এই প্রকল্পটি মাঝে মাঝে রক্ষণাবেক্ষণ আপডেটের সাথে এখনও সক্রিয়। github.com/wqweto/UMMM/commits/master । এটি ভালভাবে কাজ করে এবং আমি এটি নিয়মিত ব্যবহার করি।
UUDdLrLrSs

0

Mt.exe এর অন্তর্ভুক্ত নেই এমন প্রোগ্রামগুলি পূরণ করার জন্য, আপনি এগুলি নিবন্ধ থেকে সন্ধানের ProgIDFromCLSIDজন্য কল করতে পারেন। এর জন্য ম্যানিফেস্ট ফাইলটি শেষ করার আগে traditionalতিহ্যবাহী সিওএম নিবন্ধকরণ প্রয়োজন, তবে পরবর্তীকালে ম্যানিফেস্ট ফাইলটি স্বয়ংসম্পূর্ণ হবে।

এই সি # কোডটি ম্যানিফেস্টে সমস্ত COM ক্লাসে প্রোগড যোগ করে:

var manifest = XDocument.Load(fileName);
var namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("s", "urn:schemas-microsoft-com:asm.v1");
foreach (var classElement in manifest.XPathSelectElements("s:assembly/s:file/s:comClass", namespaceManager)) {
    var clsid = Guid.Parse(classElement.Attribute("clsid").Value);
    int result = ProgIDFromCLSID(ref clsid, out string progId); if (result != S_OK) throw new COMException($"ProgID lookup failed for {clsid}.", result);
    classElement.SetAttributeValue("progid", progId);
}
manifest.Save(fileName);

কোড এই ইন্টারপ সংজ্ঞাগুলির উপর নির্ভর করে:

[DllImport("ole32.dll")] static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgID);
const int S_OK = 0;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.