Pergunta

Uma solução alternativa para chamar regasm sem direitos de administrador já foi descrita aqui:

Interoperabilidade COM sem regasmo

Estou tentando criar uma biblioteca COM que meus usuários possam implantar e usar no Excel VBA sem privilégios de administrador.Gostei da solução alternativa do regasm, pois parece que as pessoas não têm muito sucesso ao usar objetos COM sem registro do Excel VBA.Também quero vinculação antecipada para que meus usuários possam se beneficiar da conclusão da sintaxe.

A resposta aceita na pergunta mencionada acima, entretanto, não descreve onde colocar a dll assembly no computador do usuário.São necessários direitos de administrador para instalar o assembly no GAC, então estou me perguntando onde alguém pode colocar o arquivo dll.Presumo que o diretório do aplicativo esteja sendo pesquisado por quaisquer DLLs referenciadas, mas não consigo colocar minha DLL no diretório do Excel sem os direitos de administrador novamente.É possível usar a solução alternativa com o cliente Excel?Existe alguma outra maneira de chamar objetos COM do VBA sem a necessidade de privilégios de administrador para implantá-los primeiro?

Foi útil?

Solução

.

Chamando o regasmo sem direitos administrativos para interoperação COM

Eu acho que deve ser possível usar RegistrationServices.RegisterAssembly e RegOverridePredefKey APIs para implementar o registro automático sob a colmeia de HKCU, de uma maneira amigável ao UAC.Eu postei uma resposta mais detalhada aqui .

Outras dicas

Sim, agora você tem dois problemas, você não pode colocá-lo em qualquer lugar deve coloque-o, como o GAC ou um subdiretório c:\program files.Uma vez que esses locais também exigem elevação do UAC.Você provavelmente também esqueceu de executar o Regasm.exe com a opção /codebase, necessária para informar ao CLR onde procurar o arquivo.

O usuário precisa ter privilégios suficientes para copiar a DLL para um diretório ao qual tenha acesso de gravação.Normalmente é apenas um diretório em c:\users\username, como o subdiretório appdata.A dor de cabeça que você terá que resolver é que o arquivo .reg precisa ser adaptado para cada usuário individual, já que seu nome de usuário é diferente.Então o CodeBase o valor no arquivo .reg precisa ser alterado para cada usuário.Isso é mal dimensionado, para dizer o mínimo.

A resposta que você encontrou simplesmente não é muito boa.A única solução que realmente funciona é escrever sua própria função de registro.Aquele que grava as chaves de registro em HKCU em vez de HKLM.Use o Atributo [ComRegisterFunction].Você sabe pelo arquivo .reg quais chaves você precisa escrever.E você usa Assembly.GetExecutingAssembly().Location para descobrir o que escrever para o valor do registro CodeBase.Não se esqueça da [ComUnregisterFunction].

Tenha em mente que, pelo menos em espírito, você está tentando contornar as restrições que o administrador da LAN impôs a esses usuários.Eles se preocupam muito em saber que tipo de código é executado nas máquinas que suportam.Isso pode muito bem te causar problemas, pelo menos converse com o cara.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top