.NET-дың тек оқуға арналған сипатын қалай өзгертуге болады?

Assembly.Location сипатын менің қосымшамның орындау уақытында өзгертуді қалаймын. Мен қорлардан .NET жинақтарын жүктеп жатырмын және жүктелген Ассамблеялар (жадтан жүктелген) осы өрісті бос қалдырады және ол бағдарлама жұмысын бұзады.

Мен олардың бастапқы кодын бақыламаймын. Мен бұл кодты өз кодексіме қалай айналдыру керектігін білемін, бірақ бұлай емес. Және олар Ассамблеяны қолданған кезде. Орналасу және бос жолды алады, мәселе басталады.

http://msdn.microsoft.com/en-us /library/system.reflection.assembly.location.aspx

Тек оқылады. Мұны істеудің төменгі деңгейі бар ма? Кез келген идеялар?

Менің қосымшам - ресурстарға кірістірілген бағдарламалар үшін жүктеуші, сондықтан ол оларға байланысты емес. Кез келген жинақты жадтан жүктеп көріңіз және Ассамблеяны тексеріңіз. Жүктелген жинақтардың орналасқан жері бос болмайды. Олардың орналасу орны жоқ, себебі олар жадтан жүктелді, бірақ мен оны өзгертуді қалаймын. NET ішіндегі өзгертулер немесе басқа әдіс.

Сығылған жинақтар дискке шығарылмайды. Егер сіз оны қалай жете алатындығын білсеңіз, үлкен проблемалардың қауіп-қатеріне қарсы емеспін.

2
Жаңартылған жауапты қараңыз.
қосылды автор Equality In Tech, көзі
Жаңартылған жауапты қараңыз.
қосылды автор Equality In Tech, көзі
Жаңартылған жауапты қараңыз.
қосылды автор Equality In Tech, көзі
Мен жақын дауыспен келіспеймін. Бұл мәселе тым локализацияланған емес ... ол қазіргі уақытта жалпы контексте болды және кітапханалық әзірлеушілер үшін нақты алаңдаушылық туғызды, олардың бірі құжатталмаған. Менің ойымша, бұл мәселе лайықты.
қосылды автор Equality In Tech, көзі
Мен жақын дауыспен келіспеймін. Бұл мәселе тым локализацияланған емес ... ол қазіргі уақытта жалпы контексте болды және кітапханалық әзірлеушілер үшін нақты алаңдаушылық туғызды, олардың бірі құжатталмаған. Менің ойымша, бұл мәселе лайықты.
қосылды автор Equality In Tech, көзі
Мен жақын дауыспен келіспеймін. Бұл мәселе тым локализацияланған емес ... ол қазіргі уақытта жалпы контексте болды және кітапханалық әзірлеушілер үшін нақты алаңдаушылық туғызды, олардың бірі құжатталмаған. Менің ойымша, бұл мәселе лайықты.
қосылды автор Equality In Tech, көзі
@tcaswell - Мен бұл сұрақтың сілтемесін таба алмаймын.
қосылды автор Equality In Tech, көзі
@tcaswell - Мен бұл сұрақтың сілтемесін таба алмаймын.
қосылды автор Equality In Tech, көзі
@tcaswell - Мен бұл сұрақтың сілтемесін таба алмаймын.
қосылды автор Equality In Tech, көзі
Жақсы қандай функциясы бұзылады? Сіз бұл жинақтарды басқарасыз ба? Егер солай болса, сіз осы сипатқа сүйенбеу үшін түзете аласыз ба.
қосылды автор Jon Skeet, көзі
Жақсы қандай функциясы бұзылады? Сіз бұл жинақтарды басқарасыз ба? Егер солай болса, сіз осы сипатқа сүйенбеу үшін түзете аласыз ба.
қосылды автор Jon Skeet, көзі
Неге сіз мұны істеуге тырысасыз? Пожалуйста, бізге көп контекст - жақсы жақсырақ болуы мүмкін.
қосылды автор Jon Skeet, көзі
Мұның бәрі сіздің сұрағыңызда болуы керек контекст.
қосылды автор Jon Skeet, көзі
Мұның бәрі сіздің сұрағыңызда болуы керек контекст.
қосылды автор Jon Skeet, көзі
Мұның бәрі сіздің сұрағыңызда болуы керек контекст.
қосылды автор Jon Skeet, көзі
@ BartoszWójcik қайтадан сұрақ тудырады - неге? Егер сізге тек қана құрылғыны каталогқа салыстыру керек болса, неге оны қолданбаңыздың ішінен ғана басқармаңыз? Сіз құрастыру атауын/жолын көрсетуді қолдай аласыз.
қосылды автор James, көзі
@ BartoszWójcik қайтадан сұрақ тудырады - неге? Егер сізге тек қана құрылғыны каталогқа салыстыру керек болса, неге оны қолданбаңыздың ішінен ғана басқармаңыз? Сіз құрастыру атауын/жолын көрсетуді қолдай аласыз.
қосылды автор James, көзі
@ BartoszWójcik Жинақтардың өздеріне тәуелді емес, бірақ ол бұл жинақтардың қайда болатыны туралы орналасқан жеріне байланысты болады - бұл оның мағынасы жоқ, себебі олар ешқашан орналасқан жері. Мүмкін, мен сіздің сұрағыңызға дұрыс жауап бермеймін, бірақ мен не істеп жатқаныңыздан неге толық түсінбейді.
қосылды автор James, көзі
@ BartoszWójcik Жинақтардың өздеріне тәуелді емес, бірақ ол бұл жинақтардың қайда болатыны туралы орналасқан жеріне байланысты болады - бұл оның мағынасы жоқ, себебі олар ешқашан орналасқан жері. Мүмкін, мен сіздің сұрағыңызға дұрыс жауап бермеймін, бірақ мен не істеп жатқаныңыздан неге толық түсінбейді.
қосылды автор James, көзі
@ BartoszWójcik Жинақтардың өздеріне тәуелді емес, бірақ ол бұл жинақтардың қайда болатыны туралы орналасқан жеріне байланысты болады - бұл оның мағынасы жоқ, себебі олар ешқашан орналасқан жері. Мүмкін, мен сіздің сұрағыңызға дұрыс жауап бермеймін, бірақ мен не істеп жатқаныңыздан неге толық түсінбейді.
қосылды автор James, көзі
Сұрақ шын мәнінде мағынасы жоқ, сіздің қосымша байланысты жинақтардың орналасқан жеріне, бірақ жинақтар енгізілген, сондықтан дискідегі орын жоқ.
қосылды автор James, көзі
Сұрақ шын мәнінде мағынасы жоқ, сіздің қосымша байланысты жинақтардың орналасқан жеріне, бірақ жинақтар енгізілген, сондықтан дискідегі орын жоқ.
қосылды автор James, көзі
Сұрақ шын мәнінде мағынасы жоқ, сіздің қосымша байланысты жинақтардың орналасқан жеріне, бірақ жинақтар енгізілген, сондықтан дискідегі орын жоқ.
қосылды автор James, көзі
Бұл «жауып тұрған соғыс» блогының блогы мен байланысты болғандығын ескерсек, сол сияқты нәрсені сұрайтын +11 сұраққа сілтеме бар болса, онда «жеке басының себебінен» төмендеудің бір қыры ретінде көрінеді мұнда.
қосылды автор tacaswell, көзі
Бұл «жауып тұрған соғыс» блогының блогы мен байланысты болғандығын ескерсек, сол сияқты нәрсені сұрайтын +11 сұраққа сілтеме бар болса, онда «жеке басының себебінен» төмендеудің бір қыры ретінде көрінеді мұнда.
қосылды автор tacaswell, көзі
Бұл «жауып тұрған соғыс» блогының блогы мен байланысты болғандығын ескерсек, сол сияқты нәрсені сұрайтын +11 сұраққа сілтеме бар болса, онда «жеке басының себебінен» төмендеудің бір қыры ретінде көрінеді мұнда.
қосылды автор tacaswell, көзі
Ресурстардан жүктелген қысылған жинақтармен таныс емеспін, сондықтан бұл идея өте маңызды емес: Сіз ILDASM жинағын беріп, аралық мәтінді модификациялаудан кейін ILASM арқылы айнала аласыз ба? Мен білемін, бұл өте алыс естіледі, бірақ бұл шын мәнінде біреуін қол қоюға күшті атауды өзгертудің ұсынылған тәсілі.
қосылды автор RenniePet, көзі
Ресурстардан жүктелген қысылған жинақтармен таныс емеспін, сондықтан бұл идея өте маңызды емес: Сіз ILDASM жинағын беріп, аралық мәтінді модификациялаудан кейін ILASM арқылы айнала аласыз ба? Мен білемін, бұл өте алыс естіледі, бірақ бұл шын мәнінде біреуін қол қоюға күшті атауды өзгертудің ұсынылған тәсілі.
қосылды автор RenniePet, көзі
Ресурстардан жүктелген қысылған жинақтармен таныс емеспін, сондықтан бұл идея өте маңызды емес: Сіз ILDASM жинағын беріп, аралық мәтінді модификациялаудан кейін ILASM арқылы айнала аласыз ба? Мен білемін, бұл өте алыс естіледі, бірақ бұл шын мәнінде біреуін қол қоюға күшті атауды өзгертудің ұсынылған тәсілі.
қосылды автор RenniePet, көзі
Өйткені, мен оны қалаймын, қайтадан, егер сіз шешімді білмесеңіз, мені бұл істі жасамауға сендіруге тырыспаңыз. Егер күрделі мәселелерді шеше алмасаңыз, бағдарламашы болудың мәні неде?
қосылды автор Bartosz Wójcik, көзі
@James Иә, олардың орналасқан жері жоқ, себебі олар жадтан жүктелді, бірақ мен оны өзгертуді немесе .NET ішкі өзгертулерімен немесе басқа әдістермен өзгерткім келеді.
қосылды автор Bartosz Wójcik, көзі
Менің қосымшам ресурстарға кірістірілген бағдарламалар үшін жүктеуші , сондықтан ол оларға байланысты емес. Жадтан any құралын жүктеп көріңіз және жиналған Ассамблеяның орналасуын тексеріңіз, ол бос болмайды.
қосылды автор Bartosz Wójcik, көзі
Менің қосымшам ресурстарға кірістірілген бағдарламалар үшін жүктеуші , сондықтан ол оларға байланысты емес. Жадтан any құралын жүктеп көріңіз және жиналған Ассамблеяның орналасуын тексеріңіз, ол бос болмайды.
қосылды автор Bartosz Wójcik, көзі
Менің қосымшам ресурстарға кірістірілген бағдарламалар үшін жүктеуші , сондықтан ол оларға байланысты емес. Жадтан any құралын жүктеп көріңіз және жиналған Ассамблеяның орналасуын тексеріңіз, ол бос болмайды.
қосылды автор Bartosz Wójcik, көзі
Мен олардың бастапқы кодын бақыламаймын, бұл мәселе! Мен бұл кодты өз кодексіме қалай айналдыру керектігін білемін, бірақ бұлай емес. Ассамблеяны қолданған кезде. Орналасқан жері бос жолға шығады, мәселе басталады;)
қосылды автор Bartosz Wójcik, көзі
Мен олардың бастапқы кодын бақыламаймын, бұл мәселе! Мен бұл кодты өз кодексіме қалай айналдыру керектігін білемін, бірақ бұлай емес. Ассамблеяны қолданған кезде. Орналасқан жері бос жолға шығады, мәселе басталады;)
қосылды автор Bartosz Wójcik, көзі
Мен қорлардан .NET жинақтарын жүктеп жатырмын және жүктелген Ассамблеялар (жадтан жүктелген) осы өрісті бос қалдырады және ол бағдарлама жұмысын бұзады.
қосылды автор Bartosz Wójcik, көзі
@James Иә, олардың орналасқан жері жоқ, себебі олар жадтан жүктелді, бірақ мен оны өзгертуді немесе .NET ішкі өзгертулерімен немесе басқа әдістермен өзгерткім келеді.
қосылды автор Bartosz Wójcik, көзі
Дұрыс жауапсыз бірдей сұрақ stackoverflow.com/questions/16597138/…
қосылды автор Bartosz Wójcik, көзі
Дұрыс жауапсыз бірдей сұрақ stackoverflow.com/questions/16597138/…
қосылды автор Bartosz Wójcik, көзі
Дұрыс жауапсыз бірдей сұрақ stackoverflow.com/questions/16597138/…
қосылды автор Bartosz Wójcik, көзі
Мен мұнда қауіпті жолды алып жатырмын білемін, бірақ Ассамблеяға кіру. Басқа басқарылатын жиналыстың ішіндегі жері бар ма? Егер солай болса, сіз клиент кодын қайта жазу туралы ойлануыңыз мүмкін және сіз өзіңіздің қалағаныңызды қайтаратын қоңырауды жүзеге асыруыңызға болады. Бұл мүмкін тәсіл бола алар ма еді?
қосылды автор Lorenzo Dematté, көзі
Мен мұнда қауіпті жолды алып жатырмын білемін, бірақ Ассамблеяға кіру. Басқа басқарылатын жиналыстың ішіндегі жері бар ма? Егер солай болса, сіз клиент кодын қайта жазу туралы ойлануыңыз мүмкін және сіз өзіңіздің қалағаныңызды қайтаратын қоңырауды жүзеге асыруыңызға болады. Бұл мүмкін тәсіл бола алар ма еді?
қосылды автор Lorenzo Dematté, көзі
Мен мұнда қауіпті жолды алып жатырмын білемін, бірақ Ассамблеяға кіру. Басқа басқарылатын жиналыстың ішіндегі жері бар ма? Егер солай болса, сіз клиент кодын қайта жазу туралы ойлануыңыз мүмкін және сіз өзіңіздің қалағаныңызды қайтаратын қоңырауды жүзеге асыруыңызға болады. Бұл мүмкін тәсіл бола алар ма еді?
қосылды автор Lorenzo Dematté, көзі
Мен оны керек деп айтпаймын жасай аламын .. бірақ бұл мүмкін бе? (О, және мен @RenniePet-ті бір немесе бірнеше ойлар туралы ойланамын деп ойлаймын .. Мен жадты еске салу туралы ойладым, бірақ бәрібір ...)
қосылды автор Lorenzo Dematté, көзі
Мен оны керек деп айтпаймын жасай аламын .. бірақ бұл мүмкін бе? (О, және мен @RenniePet-ті бір немесе бірнеше ойлар туралы ойланамын деп ойлаймын .. Мен жадты еске салу туралы ойладым, бірақ бәрібір ...)
қосылды автор Lorenzo Dematté, көзі
Мен оны керек деп айтпаймын жасай аламын .. бірақ бұл мүмкін бе? (О, және мен @RenniePet-ті бір немесе бірнеше ойлар туралы ойланамын деп ойлаймын .. Мен жадты еске салу туралы ойладым, бірақ бәрібір ...)
қосылды автор Lorenzo Dematté, көзі

6 жауаптар

Қажетті құрастыру қорын контейнер жинағынан контейнердің жинағының каталогына немесе ішкі каталогқа көшіріңіз. Содан кейін көшірілген жинақты қолданбаңызға салыңыз. Бұл едәуір жеңілірек болады, содан кейін жеке өрісті (немесе функциялық қоңыраудың нәтижесін) өзгертуге тырысады.

Ассамблея класы жалпыға ортақ интерфейсті көрсетеді - олар оны қолдануға тиіс. Класстың ішкі жұмысын өзгертуге тырысыңыз, тіпті мүмкін болған жағдайда, үлкен проблемаларды тудыруы мүмкін. Кейбір болашақ нұсқалар, тіпті тұрақты жаңартулар да сыныптың ішкі жұмысын өзгертіп, кодты бұзуы мүмкін. Сондай-ақ, сыныптың басқа бөліктерінің сол өріске тәуелді екенін болжай алмайсыз. Оның құндылығын өзгерту мүмкін емес салдары болуы мүмкін. Сіз өзіңіздің белгілі бір мінез-құлықтан өзгерте аласыз, ол басқа жинақтар мен бағдарламашыларға жолдың шатасуы мен бұзылуына әкелуі мүмкін. Сондықтан бұл өріс тек оқу үшін ғана іске асырылған және сондықтан .NET тек оқуға арналған мәндерді өзгертудің жеңіл әдісін ұсынады.


ЖАҢАРТУ

Орын сипаты үшін бастапқы код:

[System.Security.SecurityCritical] //auto-generated
[ResourceExposure(ResourceScope.Machine)] 
[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
[SuppressUnmanagedCodeSecurity] 
private static extern void GetLocation(RuntimeAssembly assembly,
    StringHandleOnStack retString); 

public override String Location 
{
    [System.Security.SecuritySafeCritical] //auto-generated
    [ResourceExposure(ResourceScope.Machine)]
    [ResourceConsumption(ResourceScope.Machine)] 
    get {
        String location = null; 

        GetLocation(GetNativeHandle(), 
                    JitHelpers.GetStringHandleOnStack(ref location));

        if (location != null)
            new FileIOPermission( FileIOPermissionAccess.PathDiscovery, location ).Demand();

        return location; 
    }
} 

Note that this code is actually located inside an undocumented class named RuntimeAssembly which is defined as internal within the Assembly class. You can see the full source code here:
http://www.dotnetframework.org/default.aspx/[email protected]/[email protected]/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/src/BCL/System/Reflection/[email protected]/1305376/[email protected]

Көріп отырғаныңыздай, мұнда өзгерту үшін ешқандай қолдау өрісі жоқ. Орын сипатын қалауыңызша (Windows ОЖ бөліктерін қайта жазбастан) елемеудің ешқандай жолы жоқ.

AND... just in case you get a hankerin' for rewriting that GetLocation function, you may be interested in this Q/A:
What is [DllImport("QCall")]?
(It probably goes without saying that, at this point, you are on your own.)

8
қосылды
@RenniePet: Бастапқы код ашық болып табылады: referencesource.microsoft.com/netframework.aspx
қосылды автор jgauffin, көзі
Бұл қысу деп бірінші рет айттыңыз. Сіз өзіңіздің не істеп жатқаныңызды және неге сіз не істеп жатқанын түсіндіре аласыз. «Сіз күрделі мәселелерді шеше алмасаңыз, бағдарламашы болудың қандай мәні бар?» Деп айттыңыз. . Жұмыс істің бөлігі басқа жолды табады , егер ағымдағы жол сізді қайда барғыңыз келмесе. Сұрақ қою әдісі бөлімін қараңыз: «Сұрағыңызға жауап әрдайым қалауы мүмкін , бірақ бұл дұрыс емес дегенді білдірмейді.
қосылды автор Equality In Tech, көзі
(Айтпақшы, Джон Скейт - C# -дегі ең басты сарапшылардың бірі. жасаған немесе жасалмаған болса, оның кеңесіне көп назар аударған жөн болар еді.)
қосылды автор Equality In Tech, көзі
@Bartosz - netshrink -ге қатысты ештеңе жоқ па? Сіздің сұрағыңыз негізінен жақсы болды. Менің ойымша, егер сіз жақсы нәрселерді түсіндірген болсаңыз, ол шынымен де жақсы көңіл-күй мен қатаң жауаптар алды. Мүмкін, сіз оны қайта қарауды қаласаңыз, оны қайта ашуға болады.
қосылды автор Equality In Tech, көзі
@RenniePet - Мен Bartosz профилінен netshrink сілтемесін алдым. Microsoft корпорациясы .net торабы үшін бастапқы кодты олардың анықтамалық лицензиясы бойынша шығарды. Веб-сайт өте жақсы емес, бірақ бастапқы кодты жүктеуден және орнатудан оңайырақ.
қосылды автор Equality In Tech, көзі
@ Cyborgx37 бұл мәселені жақын арада көруге тырысқан әділ ойын, бірақ өкінішке орай ОП өте қыңыр болып шығады және ол жасауға тырысатын нәрсе кез келген стандартты/қолайлы тәсілмен (бар болса) қол жеткізе алмайды. good әзірлеушісі бола тұра, сіз дұрыс емес көзқараста болғаныңызда, неге түсінесіздер және баламаны іздестіруді білесіздер, ОС мұны қаламайды, сондықтан IMO өз құрылғыларына қалдырылуы мүмкін .
қосылды автор James, көзі
+1 Сіздің зерттеулеріңіз үшін. Сіз dotnetframework.org торабына сілтеме бергендігіңізді білгіңіз келеді - ол Firefox немесе IE 10-де өте жақсы жұмыс істемейді. Және олар бастапқы кодты қайдан алды, Microsoft корпорациясы оны жариялады ма? Нетшринк туралы сіздің болжамыңызға келетін болсақ, Bartosz 'SO профилі осы веб-сайтқа сілтеме жасайды, сондықтан болжанған нәрсе.
қосылды автор RenniePet, көзі
Мен кешірім сұраймын, бірақ қысылған жинақтар дискіге шығарылмайды. Мен келеді үлкен проблемалар, егер сіз білесіз, оны қалай жетуге болады.
қосылды автор Bartosz Wójcik, көзі
Мен оған сарапшы боламын деп ойламаймын. Мен жай ғана тапсырманы орындауды қалаймын, егер мұны жасай алмасаңыз, бұл мүмкін емес. Бұл жадқа жүктелген код, сондықтан оны жасай аласыз. Мен осы екі күннің ішінде награда бастаймын.
қосылды автор Bartosz Wójcik, көзі
Мен RefLector ішіндегі GetLocation бағдарламасының іске асырылуын көрдім (бұл бірінші кезекте көз алдым), бұл CLR.dll туындының кодына әкеледі, мен бұл lib-ге түпнұсқаны қою туралы ойлаймын.
қосылды автор Bartosz Wójcik, көзі

Жай сөзбен айтқанда, сипатты өзгерте алмайсыз. Бұл жағдайда сізге бұл Ассамблеяның дискіден жүктелгенін хабарлау. Оның орнына жинақты жылжыту керек және қолданбаның жаңа орыннан жүктелуін қамтамасыз ету керек.

4
қосылды
@ BartoszWójcik: Сіз өрісті Reflection арқылы өзгертуді қалайсыз деп ойлайсыз, бірақ бұл сізді одан кейінгі сызықтан кейінгі ауырсыну тудырады. Айналдырғаннан кейін уақытты түзетуді бастаңыз. Оның орнына бастапқы мәселені шешіп көрейік
қосылды автор Ian, көзі
@ BartoszWójcik: Тағы да қателеспесең, тіпті өрісті «Reflection» арқылы орнатуға болмайды, себебі ол ішкі сақталған ауыспалы болмайды. Windows API-ке шақырылатын ішкі функцияның нәтижесін өзгерту қажет.
қосылды автор Ian, көзі
@ BartoszWójcik: Жоқ, бұл шынымен - бұл жауап. Егер сіз Ассамблеяға негізделген жинақтарды пайдаланып жатсаңыз. Орналасқан жеріңіз сіз қол жеткізе алмайтын құндылық болып табылса, онда бұл жинақтар оларды сіз қолданып отырған мақсатыңызға сәйкес келмейді.
қосылды автор Jon Skeet, көзі
Досыма осы блог жазбасын көрсетіңіз blogs.msdn.com /b/thottams/archive/2006/04/26/583722.aspx және маған Ассамблеяның гетер әдісін өзгерту мүмкін болатынын айтты. Қалаған нәрсемді қайтаруға арналған жерді осы көріңіз.
қосылды автор Bartosz Wójcik, көзі
Exe-compression туралы білетіндігіңізді білмеймін, бірақ бұл мәселе және оны шешу керек. Сізге ұнауы мүмкін, бірақ барлық проблемалар жақсы және оңай түзетілмейді. Сіз онымен дау тудыруы мүмкін, бірақ бұл менің клиенттерім үшін нақты проблема және онымен күресу керек. Сіз маған шешім туралы айтып бердіңіз, бірақ ешқандай коды көрсетілмеді, менің ойымша, мен осы жерде жаман бағдарламашылар емеспін ...
қосылды автор Bartosz Wójcik, көзі
Бұл жауап емес, мен тек осы сипатты рефлексия, жұмыс уақыты бланкі түрлендіру немесе қажетті басқа құралдар арқылы өзгертуді қалаймын.
қосылды автор Bartosz Wójcik, көзі
Дегенмен, ол дұрыс жауап жоқ. .NET - бұл негіздеме және ол ішкі айнымалыларды өзгерту және тек өрістерді оқу әдісі болуы керек, мен құжатталған жолын іздемеймін.
қосылды автор Bartosz Wójcik, көзі
Бірақ бұл бастапқы мәселе. Екі жинақ бірдей дискілік жолдың астында біріктіріледі. Олардың біреуі жадтан қотарылады және орналасу жолын ішіндегі сақталатын орындалатын файлға бағыттауды қалаймын. Егер шешіміңізді білмесеңіз, басқаларға түсініктеме беріңіз.
қосылды автор Bartosz Wójcik, көзі
@Ian маған кодты көрсетіңіз, бұл барлық нүкте :)
қосылды автор Bartosz Wójcik, көзі

Жай сөзбен айтқанда, сипатты өзгерте алмайсыз. Бұл жағдайда сізге бұл Ассамблеяның дискіден жүктелгенін хабарлау. Оның орнына жинақты жылжыту керек және қолданбаның жаңа орыннан жүктелуін қамтамасыз ету керек.

4
қосылды
@ BartoszWójcik: Сіз өрісті Reflection арқылы өзгертуді қалайсыз деп ойлайсыз, бірақ бұл сізді одан кейінгі сызықтан кейінгі ауырсыну тудырады. Айналдырғаннан кейін уақытты түзетуді бастаңыз. Оның орнына бастапқы мәселені шешіп көрейік
қосылды автор Ian, көзі
@ BartoszWójcik: Тағы да қателеспесең, тіпті өрісті «Reflection» арқылы орнатуға болмайды, себебі ол ішкі сақталған ауыспалы болмайды. Windows API-ке шақырылатын ішкі функцияның нәтижесін өзгерту қажет.
қосылды автор Ian, көзі
@ BartoszWójcik: Жоқ, бұл шынымен - бұл жауап. Егер сіз Ассамблеяға негізделген жинақтарды пайдаланып жатсаңыз. Орналасқан жеріңіз сіз қол жеткізе алмайтын құндылық болып табылса, онда бұл жинақтар оларды сіз қолданып отырған мақсатыңызға сәйкес келмейді.
қосылды автор Jon Skeet, көзі
Exe-compression туралы білетіндігіңізді білмеймін, бірақ бұл мәселе және оны шешу керек. Сізге ұнауы мүмкін, бірақ барлық проблемалар жақсы және оңай түзетілмейді. Сіз онымен дау тудыруы мүмкін, бірақ бұл менің клиенттерім үшін нақты проблема және онымен күресу керек. Сіз маған шешім туралы айтып бердіңіз, бірақ ешқандай коды көрсетілмеді, менің ойымша, мен осы жерде жаман бағдарламашылар емеспін ...
қосылды автор Bartosz Wójcik, көзі
@Ian маған кодты көрсетіңіз, бұл барлық нүкте :)
қосылды автор Bartosz Wójcik, көзі
Досыма осы блог жазбасын көрсетіңіз blogs.msdn.com /b/thottams/archive/2006/04/26/583722.aspx және маған Ассамблеяның гетер әдісін өзгерту мүмкін болатынын айтты. Қалаған нәрсемді қайтаруға арналған жерді осы көріңіз.
қосылды автор Bartosz Wójcik, көзі
Бұл жауап емес, мен тек осы сипатты рефлексия, жұмыс уақыты бланкі түрлендіру немесе қажетті басқа құралдар арқылы өзгертуді қалаймын.
қосылды автор Bartosz Wójcik, көзі
Дегенмен, ол дұрыс жауап жоқ. .NET - бұл негіздеме және ол ішкі айнымалыларды өзгерту және тек өрістерді оқу әдісі болуы керек, мен құжатталған жолын іздемеймін.
қосылды автор Bartosz Wójcik, көзі
Бірақ бұл бастапқы мәселе. Екі жинақ бірдей дискілік жолдың астында біріктіріледі. Олардың біреуі жадтан қотарылады және орналасу жолын ішіндегі сақталатын орындалатын файлға бағыттауды қалаймын. Егер шешіміңізді білмесеңіз, басқаларға түсініктеме беріңіз.
қосылды автор Bartosz Wójcik, көзі

Жай сөзбен айтқанда, сипатты өзгерте алмайсыз. Бұл жағдайда сізге бұл Ассамблеяның дискіден жүктелгенін хабарлау. Оның орнына жинақты жылжыту керек және қолданбаның жаңа орыннан жүктелуін қамтамасыз ету керек.

4
қосылды
@ BartoszWójcik: Сіз өрісті Reflection арқылы өзгертуді қалайсыз деп ойлайсыз, бірақ бұл сізді одан кейінгі сызықтан кейінгі ауырсыну тудырады. Айналдырғаннан кейін уақытты түзетуді бастаңыз. Оның орнына бастапқы мәселені шешіп көрейік
қосылды автор Ian, көзі
@ BartoszWójcik: Тағы да қателеспесең, тіпті өрісті «Reflection» арқылы орнатуға болмайды, себебі ол ішкі сақталған ауыспалы болмайды. Windows API-ке шақырылатын ішкі функцияның нәтижесін өзгерту қажет.
қосылды автор Ian, көзі
@ BartoszWójcik: Жоқ, бұл шынымен - бұл жауап. Егер сіз Ассамблеяға негізделген жинақтарды пайдаланып жатсаңыз. Орналасқан жеріңіз сіз қол жеткізе алмайтын құндылық болып табылса, онда бұл жинақтар оларды сіз қолданып отырған мақсатыңызға сәйкес келмейді.
қосылды автор Jon Skeet, көзі
@Ian маған кодты көрсетіңіз, бұл барлық нүкте :)
қосылды автор Bartosz Wójcik, көзі
Досыма осы блог жазбасын көрсетіңіз blogs.msdn.com /b/thottams/archive/2006/04/26/583722.aspx және маған Ассамблеяның гетер әдісін өзгерту мүмкін болатынын айтты. Қалаған нәрсемді қайтаруға арналған жерді осы көріңіз.
қосылды автор Bartosz Wójcik, көзі
Exe-compression туралы білетіндігіңізді білмеймін, бірақ бұл мәселе және оны шешу керек. Сізге ұнауы мүмкін, бірақ барлық проблемалар жақсы және оңай түзетілмейді. Сіз онымен дау тудыруы мүмкін, бірақ бұл менің клиенттерім үшін нақты проблема және онымен күресу керек. Сіз маған шешім туралы айтып бердіңіз, бірақ ешқандай коды көрсетілмеді, менің ойымша, мен осы жерде жаман бағдарламашылар емеспін ...
қосылды автор Bartosz Wójcik, көзі
Бұл жауап емес, мен тек осы сипатты рефлексия, жұмыс уақыты бланкі түрлендіру немесе қажетті басқа құралдар арқылы өзгертуді қалаймын.
қосылды автор Bartosz Wójcik, көзі
Дегенмен, ол дұрыс жауап жоқ. .NET - бұл негіздеме және ол ішкі айнымалыларды өзгерту және тек өрістерді оқу әдісі болуы керек, мен құжатталған жолын іздемеймін.
қосылды автор Bartosz Wójcik, көзі
Бірақ бұл бастапқы мәселе. Екі жинақ бірдей дискілік жолдың астында біріктіріледі. Олардың біреуі жадтан қотарылады және орналасу жолын ішіндегі сақталатын орындалатын файлға бағыттауды қалаймын. Егер шешіміңізді білмесеңіз, басқаларға түсініктеме беріңіз.
қосылды автор Bartosz Wójcik, көзі

@ Cyborgx37 дұрыс болғанымен, бар жинақтың орналасқан жерін өзгерте алмайсыз, бұл мәселеге басқа жолмен шығу керек.

Бұрыннан жүктелген жинақтың орнын орнатуға тырысудың орнына, осы сипатты пайдаланып құрастыруды қайта жазу үшін Mono.Cecil сияқты кітапхананы пайдаланыңыз.

Бұл базалық .NET Framework жинақтарының біреуі болмаса, барлық Assembly.Location қатынасын өзіңіздің статикалық қасиетіңізбен ауыстыруға болатын өте оңай.

Мен өзімнің шифрланған жинауышымды жазған кезде көп нәрсені істеуге тура келді және өте сәтті болды.

ӨҢДЕУ

Егер сіз шынымен де өлген болсаңыз, осы екі мақаланы орындау уақытында қайта шығару әдісін қайта жазуды бастаңыз. Бірнеше ескерту бар, бірақ бұл NGEN немесе GAC жүйесімен жұмыс істемейді және сізде шешуге тура келетін синхрондау/күту/санау/ерекше жағдайларды өңдеудің бірнеше қиындықтары болады. Өзіңіздің тәуекеліңізді пайдаланыңыз.

MSIL инъекциясы: орындау уақытында динамикалық емес әдісті қайта жазу

CLR инъекциясы: Runtime әдістері қайталаушы

Мен оған қатты кеңес беремін, себебі бұл шешім ӛндіріс кодексінде қолдануға өте мықты, авторлар айтқан:

Біз CLR жадын тікелей жоспарланбаған тәсілдермен басқаратынымызды есте ұстауымыз керек. Бұл код .NET құрылымының жаңа нұсқаларында жұмыс істемеуі мүмкін. Бұл Vista x86 жүйесіндегі .NET 3.5 арқылы тексерілген және сіздің компьютеріңізде жұмыс істемеуі мүмкін.

және

Майкрософт осы хакерлік заттардың ешқайсысын қолдамайды. Егер мүмкін болса, мақсатыңызды орындау үшін тағы бір амал қарастырыңыз.

4
қосылды
Күшті! ОР-ның мақсаттарына сәйкес келеді. Мен бұл жауапты қабылдаған болар едім.
қосылды автор Equality In Tech, көзі

Ұзақ жауап көп;

Орналасқан жері сатып алушысы арқылы қайтарылған мән, мысалы, қолдау сияқты сақталмаған құндылық болып табылады, себебі қиын болғандықтан (сіз күмәндансаңыз екен деп сенімдімін)

  private readonly string location;

Оның орнына, Ассамблея (немесе осы класқа дерексіз, RuntimeAssembly ), ол заттарды жадтан жүктегеннен кейін алынған ішкі сыныпқа арналған туындыны қолдана отырып алынады содан кейін орынды оқу үшін сыртқы dll қоңырауын қолданыңыз.

Бұл ұқсас (қарапайым) көрінеді;

[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
private static extern void GetLocation(RuntimeAssembly assembly, StringHandleOnStack retString);

public override String Location {
  get {
    String location = null;
    GetLocation(GetNativeHandle(), JitHelpers.GetStringHandleOnStack(ref location));

    return location;
  }
}

Міндетті енгізуге қарағанда, бұл бос емес болу үшін кодты өзгерту үшін сізге оңай болады.

- L Лориет--

1
қосылды
++ 1 осыған дейін көтерілу
қосылды автор james raygan, көзі