DllNotFoundException no plugin unity3d para c ++ dll

Eu estou trabalhando no projeto Unity Plugin e tente importar a DLL nativa c ++ do arquivo c #. Mas continuo recebendo dllnotfoundexception.

c ++ dll code:

<code>extern "C" {
extern __declspec( dllexport ) bool IGP_IsActivated();
}
</code>

c # code:

<code>[DllImport("mydll")]
    private static extern bool IGP_IsActivated();
</code>

DLL está no lugar e FIle.Exists funcionar corretamente. Todas as dlls dependentes estão presentes na mesma hierarquia, mas ainda acabam na exceção dllnotfound.

Qualquer ajuda, muito apreciada !!

 Alex18 de dez de 2013 17:09
o plugin está disponível em algum lugar?

questionAnswers(5)

Bem eu consegui trabalhar. Para outros que podem enfrentar este problema, se você tiver mais de uma dll, você precisa colocar as dlls secundárias no nível raiz do editor Unity (por exemplo, C: \ Arquivos de Programas \ Unity \ Editor) e a dll referenciada do script em pasta de plugins. Isso funcionou para mim.

 hsmith06 de mar de 2013 07:06
@TrolleFar isso funcionou para mim, me salvou horas de dores de cabeça obrigado por postar a pergunta, respostas e comentários!
 Akirayjin05 de set de 2013 05:53
Eu continuo a receber os Exception mesmo eu coloco o arquivo dll no diretório do projeto e na pasta mesmo arquivo exe após a compilação. O Visual C ++ Redistributable é necessário? Eu construo dll a partir do Visual C ++ 2008 SP1 e instalei todo o Visual C ++ 2008 Redistributable disponível no site da microsoft ainda obter exceção dll não encontrado em outra máquina.
 TrolleFar04 de jul de 2012 02:25
Um lugar melhor para os arquivos dll seria na pasta do projeto. Basta colocar os arquivos dll na mesma pasta que as pastas "Ativos" e "Biblioteca".
 jozzas11 de ago de 2014 06:21
Eu tentei todas essas soluções por horas ... Acontece que minha DLL externa era de 32 bits e meu projeto Unity era de 64 bits. Estava ficandoDllNotFoundException então fui levado pelo caminho do jardim ... outra coisa a se observar.
 vipin816928 de fev de 2019 04:02
Tentei tudo, nada funcionou. Por favor ajudestackoverflow.com/questions/54898629/…

Certifique-se de que a seguinte lista de chacks esteja satisfeita:

Todos os plugins devem ficar em uma pasta chamada Plugins.A arquitetura para a qual sua dll foi construída (x86 ou x86_64) deve corresponder à versão da arquitetura do Unity Editor. O Unity Editor 32-bit não carregará plugins de 64 bits e vice-versa.Se você está direcionando arquiteturas de 32 e 64 bits, você deve colocar suas dlls em pastas com nomes especiais dentro da pasta Plugins. Os nomes são Plugins / x86 para dlls de 32 bits e Plugins / x86_64 (x64 também funciona) para dlls de 64 bits.Redistribuíveis Visual C ++ devem ser instalados. Eu tenho tudo a partir de 2008.Quando você constrói todas as suas dlls devem ser copiadas para a raiz onde seu executável está (e novamente construído para a arquitetura x86 / x64 correta)

Se você continuar recebendo um erro de namespace, significa que a dll que você está importando tem código não gerenciado e deve ser empacotada em outra dll gerenciada Pugin para funcionar.

Esses tópicos estão um pouco desatualizados, mas ainda são relevantes

DLLNotFoundException - Plugin Unity3D

Erro interno do compilador Unity com DLL personalizada

 vipin816928 de fev de 2019 03:56
Olá, você poderia por favor me ajudar com isso -stackoverflow.com/questions/54898629/…

Passei um dia com esse erro. Meu problema era que o Android não obtém a biblioteca e sempre obtém o erro DDLNotFound. Minha solução foi:

1.- Certifique-se de ter as bibliotecas para a arquitetura apropriada na pasta Plugins.

Plugins / Android / x86 e Plugins / Android / armeabi-v7a se suas configurações de construção forem FAT (x86 & arm)

2.- Verifique se Unity os reconhece como bibliotecas. Se você selecioná-los na guia Projeto, deverá vê-los como uma biblioteca e a plataforma e a arquitetura relacionadas.

3.- Após a compilação (não feche o Unity Editor!), Você pode checar em Temp / StagingArea / libs se suas bibliotecas estão lá. Se houver certeza de que as bibliotecas estarão no APK. Como uma verificação dupla, você pode abrir seu APK (mudar para extensão zip) e ver as bibliotecas na pasta lib.

4.- Em C # você deve remover qualquer prefixo de lib em seu nome de biblioteca, por exemplo:

Se o nome da sua biblioteca for "libdosomething.so", você deverá chamá-lo como

[DllImport ("dosomething")]

Espero que este trabalho para você :)

Felicidades.

 Adrian G14 de fev de 2019 11:09
Isso me ajudou. Eu estou usando o Unity 2018.3 e a arquitetura apropriada é agora Plugins / Android_x86 e Plugins / Android_armeabi-v7a. Eu também coloco uma biblioteca em Plugins / Android_arm64-v8a mas enquanto Unity a reconhece como arm64 ela não é usada .. Android_x86_64 não é suportado

r \ Works \ Best \ Plugins.

Coloque quaisquer DLLs de dependência que não sejam acessadas diretamente pelos seus scripts no Project. Isso permitirá que seu programa seja executado no editor.

Quando você construir, copie novamente os arquivos DLL de dependência, desta vez para a raiz do diretório de compilação (ao lado do executável gerado). Isso deve permitir que seu aplicativo os carregue em tempo de execução.

(Dica: você pode usarWalker de Dependência olhar para você DLLs e ver o que eles dependem.)

Graças a istoPostagem no fórum do Unity Eu criei uma boa solução que modifica oPATH-environment variável no tempo de execução:

Colocartodos DLLs (ambas as DLLs com as quais o Unity faz interface e suas DLLs dependentes)Project\Assets\Wherever\Works\Best\Plugins.

Coloque o seguinte construtor estático em uma classe que usa o plug-in:

static MyClassWhichUsesPlugin() // static Constructor
{
    var currentPath = Environment.GetEnvironmentVariable("PATH",
        EnvironmentVariableTarget.Process);
#if UNITY_EDITOR_32
    var dllPath = Application.dataPath
        + Path.DirectorySeparatorChar + "SomePath"
        + Path.DirectorySeparatorChar + "Plugins"
        + Path.DirectorySeparatorChar + "x86";
#elif UNITY_EDITOR_64
    var dllPath = Application.dataPath
        + Path.DirectorySeparatorChar + "SomePath"
        + Path.DirectorySeparatorChar + "Plugins"
        + Path.DirectorySeparatorChar + "x86_64";
#else // Player
    var dllPath = Application.dataPath
        + Path.DirectorySeparatorChar + "Plugins";

#endif
    if (currentPath != null && currentPath.Contains(dllPath) == false)
        Environment.SetEnvironmentVariable("PATH", currentPath + Path.PathSeparator
            + dllPath, EnvironmentVariableTarget.Process);
}

Adicionar[InitializeOnLoad] para a classe para se certificar de que o construtor éexecutar no lançamento do editor:

 [InitializeOnLoad]
 public class MyClassWhichUsesPlugin
 {
     ...
     static MyClassWhichUsesPlugin() // static Constructor
     {
         ...
     }
  }

Com este script não há necessidade de copiar em torno de DLLs. O editor da Unity os encontra noAssets/.../Plugins/...-folder e o executável os encontra em..._Data/Plugins-diretório (onde eles são copiados automaticamente ao construir).

 rusty22 de mar de 2018 17:30
Não consegui obter a estática para funcionar no Unity 2017.3.1f1. Em tempo de execução, recebi: "UnityException: get_dataPath não pode ser chamado de um construtor MonoBehaviour (ou inicializador de campo de instância), chamá-lo em Awake ou Start." Eu mudei para usar Awake () e funcionou bem e o editor e na minha compilação.
 Hafnernuss09 de abr de 2019 23:47
Esta é realmente uma solução muito elegante que permite o uso de bibliotecas externas no modo edtior (para uso com scripts de inspetor), algo que não é fácil de fazer quando é feito da maneira "normal".

yourAnswerToTheQuestion