I don't think it will be necessarily be a problem if you check the apartment state of whatever thread is calling into the dll first using Thread.CurrentThead.GetApartmentState().
If it's STA and your COM object requires STA or if it's MTA and the COM object requires MTA, then you can go ahead and create your COM object on the calling theead.
However, if it's STA and the COM object requires MTA or vice versa, then the only safe thing to do would be to create a new thread, use Thead.SetApartmentState() to set it to whatever the COM object needs, start the thread and then create the COM object on it.
If the apartment state is reported as 'Unknown', then that's effectively MTA.
Although you can change the apartment state of an existing thread in certain circumstances, that's probably not a good idea as you don't know what else the user may be doing on that thread.